Vanaf sgcWebSockets 2024.2.0 wordt AMQP 1.0.0 ondersteund.
AMQP (Advanced Message Queuing Protocol) 1.0.0 is een berichtenprotocol dat is ontworpen voor betrouwbare, asynchrone communicatie tussen gedistribueerde systemen. Het maakt de uitwisseling van berichten tussen toepassingen of componenten op een ontkoppelde manier mogelijk, zodat ze kunnen communiceren zonder directe afhankelijkheden.
Over het geheel genomen biedt AMQP 1.0.0 een gestandaardiseerde en interoperabele manier voor verschillende softwarecomponenten en systemen om losjes gekoppeld te communiceren, wat het geschikt maakt voor diverse gedistribueerde en enterprise-toepassingen.
AMQP-functies
- Berichtgeoriënteerde communicatie: AMQP 1.0.0 draait om het concept van berichten. Berichten kunnen data, instructies of commando's bevatten en zijn de fundamentele eenheden van communicatie.
- Message Brokers: Het protocol werkt op basis van een brokered messaging-model. Brokers, die servers of tussenliggende entiteiten kunnen zijn, beheren het routeren en bezorgen van berichten tussen producers en consumers.
- Queues en Exchanges: Queues zijn opslagentiteiten binnen de broker waarin berichten tijdelijk worden bewaard. Exchanges definiëren de regels voor het routeren van berichten van producers naar queues op basis van criteria zoals berichtinhoud of routing keys.
- Adressen en Links: Adressen identificeren berichtbestemmingen binnen de messaging-infrastructuur. Links zijn communicatiekanalen tussen een verzender (producer) en een ontvanger (consumer) die aan een specifiek adres zijn gekoppeld.
- Sessies en verbindingen: Sessies vertegenwoordigen een logisch kanaal voor communicatie en maken meerdere stromen berichten binnen één verbinding mogelijk. Verbindingen beheren de algehele communicatieverbinding tussen clienttoepassingen en de message broker.
- Beveiliging: AMQP 1.0.0 ondersteunt verschillende beveiligingsmechanismen, waaronder authenticatie en autorisatie, om veilige communicatie tussen clients en brokers te garanderen.
- Transport-onafhankelijk: Het protocol is ontworpen om transport-onafhankelijk te zijn, wat betekent dat het kan werken over verschillende netwerktransporten zoals TCP, TLS of WebSockets, wat flexibiliteit bij implementatie biedt.
- Flow control: AMQP 1.0.0 bevat mechanismen voor flow control, waarmee consumers kunnen aangeven hoeveel binnenkomende berichten ze met welk tempo kunnen verwerken. Dit voorkomt dat consumers worden overspoeld met een groot aantal berichten.
- Foutafhandeling: Het protocol specificeert mechanismen voor foutafhandeling, waaronder bevestiging en afwijzing van berichten, voor robuustheid en betrouwbaarheid bij de berichtbezorging.
- SASL-authenticatie: Simple Authenticatie and Security Layer (SASL) wordt gebruikt voor het authenticeren en beveiligen van verbindingen tussen clients en brokers.
Configuratie
De AMQP 1.0.0-client heeft de eigenschap AMQPOptions waarmee je de verbinding kunt configureren.
- ChannelMax: De channel-max-waarde is het hoogste kanaalnummer dat op de verbinding gebruikt kan worden. Deze
waarde plus één is het maximale aantal sessies dat gelijktijdig actief kan zijn op de
verbinding. - ContainerId: (optioneel) is de naam van de broncontainer, identificeert de verbinding uniek in de server.
- CreditSize: standaardgrootte van de credit flow.
- IdleTimeout: De timeout wordt geactiveerd door een lokale peer wanneer geen frames
worden ontvangen nadat een drempelwaarde is overschreden. De idle timeout wordt gemeten in milliseconden, en begint vanaf
het moment dat het laatste frame is ontvangen. - MaxFrameSize: de maximaal geaccepteerde framegrootte.
- MaxLinksPerSession: het maximale aantal links per sessie.
- WindowSize: de standaardvenstergrootte.
De AMQP-authenticatie moet worden geconfigureerd in de Authenticatie-eigenschap.
- AuthType: type authenticatie
- amqp1authNone: niet geconfigureerd.
- amqp1authSASLAnonymous: anonieme authenticatie
- amqp1authSASLPlain: gebruikersnaam/wachtwoord-authenticatie. Dit type authenticatie vereist het invullen van de volgende eigenschappen:
- Username
- Password
- amqp1authSASLExternal: externe authenticatie
Verbinding
De verbinding begint met de client (meestal een berichtentoepassing of -service) die een TCP-verbinding opzet naar de server (de message broker). De client maakt verbinding met de poort van de server, doorgaans 5672 voor niet-TLS-verbindingen en 5671 voor TLS-beveiligde verbindingen. Zodra de TCP-verbinding tot stand is gebracht, onderhandelen client en server over de AMQP-protocolversie die ze zullen gebruiken. AMQP 1.0.0 ondersteunt verschillende versies, en tijdens de onderhandeling komen beide partijen overeen versie 1.0.0 te gebruiken.
Na de protocolonderhandeling moet de client zich mogelijk authenticeren bij de server, afhankelijk van de serverconfiguratie. Authenticatiemechanismen kunnen SASL-mechanismen (Simple Authenticatie and Security Layer) zoals PLAIN, EXTERNAL of andere door de server ondersteunde mechanismen omvatten.
Voorbeeld: verbinden met een AMQP-server die luistert op de beveiligde poort 5671 en SASL-credentials gebruikt
// Creating AMQP client oAMQP := TsgcWSPClient_AMQP1.Create(nil); // Setting AMQP authentication options oAMQP.AMQPOptions.Authentication.AuthType := amqp1authSASLPlain; oAMQP.AMQPOptions.Authentication.Username := 'sgc'; oAMQP.AMQPOptions.Authentication.Password := 'sgc'; // Creating WebSocket client oClient := TsgcWebSocketClient.Create(nil); // Setting WebSocket specifications oClient.Specifications.RFC6455 := False; // Setting WebSocket client properties oClient.Host := 'www.esegece.com'; oClient.Port := 5671; oClient.TLS := True; // Assigning WebSocket client to AMQP client oAMQP.Client := oClient; // Activating WebSocket client oClient.Active := True;
Sessies
Zodra de client is geauthenticeerd, opent deze een AMQP-sessie. Een sessie is een logische context voor communicatie tussen de client en server. Sessies worden gebruikt om gerelateerde messaging-bewerkingen te groeperen. Gebruik de methode CreateSession om een nieuwe sessie aan te maken; je kunt daarbij een sessienaam opgeven of leeg laten — dan kent de component er automatisch een toe.
Als de sessie succesvol is aangemaakt, wordt de gebeurtenis OnAMQPSessionOpen aangeroepen met de details van de sessie.
AMQP1.CreateSession('MySession');
procedure AMQP1AMQPSessionOpen(Sender: TObject; const aSession: TsgcAMQP1Session;
const aBegin: TsgcAMQP1FrameBegin);
begin
ShowMessage('#session-open: ' + aSession.Id);
end;
Links
Binnen een sessie maakt de client links aan om te communiceren met specifieke entiteiten zoals queues, topics of andere door de server geleverde resources. Links zijn bidirectionele communicatiekanalen voor het versturen en ontvangen van berichten.
De component kan fungeren als sender- en receiver-node. Maakt het mogelijk om een willekeurig aantal links per sessie aan te maken, tot aan de limiet die is ingesteld in de eigenschap MaxLinksPerSession.
Sender Links
Om een nieuwe sender link aan te maken, gebruik je de methode CreateSenderLink en geef je de naam van de sessie en optioneel de naam van de sender link door. Als de link succesvol is aangemaakt, wordt de gebeurtenis OnAMQPLinkOpen aangeroepen.
AMQP1.CreateSenderLink('MySession', 'MySenderLink');
procedure procedure TfrmClientAMQP1.AMQP1AMQPLinkOpen(Sender: TObject;
const aSession: TsgcAMQP1Session; const aLink: TsgcAMQP1Link; const aAttach: TsgcAMQP1FrameAttach);
begin
ShowMessage('#link-open: ' + aLink.Name);
end;
Receiver Links
Om een nieuwe receiver link aan te maken, gebruik je de methode CreateReceiverLink en geef je de naam van de sessie en optioneel de naam van de receiver link door. Als de link succesvol is aangemaakt, wordt de gebeurtenis OnAMQPLinkOpen aangeroepen.
AMQP1.CreateReceiverLink('MySession', 'MyReceiverLink');
procedure procedure TfrmClientAMQP1.AMQP1AMQPLinkOpen(Sender: TObject;
const aSession: TsgcAMQP1Session; const aLink: TsgcAMQP1Link; const aAttach: TsgcAMQP1FrameAttach);
begin
ShowMessage('#link-open: ' + aLink.Name);
end;
Berichten versturen
Met de sessie opgezet en links aangemaakt, kan de client beginnen met berichtbewerkingen zoals het versturen van berichten naar een bestemming. Gebruik de methode SendMessage om een bericht te versturen via een sender link.
AMQP1.SendMessage('MySession', 'MySenderLink', 'My first AMQP Message');
Berichten lezen
Standaard worden Receiver Links aangemaakt in Automatic-modus, wat betekent dat elk nieuw binnenkomend bericht aan de client wordt bezorgd.
Als de Receiver Links zijn aangemaakt in manual-modus, gebruik je de synchrone methode GetMessage om op te halen en te wachten tot een nieuw bericht arriveert.
In zowel Automatic- als Manual-modus wordt elke keer dat een nieuw bericht arriveert de gebeurtenis OnAMQPMessage aangeroepen.
procedure OnAMQPMessageEvent(Sender: TObject; const aSession:
TsgcAMQP1Session; const aLink: TsgcAMQP1ReceiverLink; const aMessage:
TsgcAMQP1Message; var DeliveryState: TsgcAMQP1MessageDeliveryState);
begin
ShowMessage(aMessage.ApplicationData.AMQPValue.Value);
end;
Documentatie
AMQP1 Delphi-client
Lees meer over de Delphi / CBuilder AMQP 1.0.0-client https://www.esegece.com/help/sgcWebSockets/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htmDemo downloaden
Download de AMQP 1.0.0-client-demo gecompileerd voor Windows met behulp van de sgcWebSockets-bibliotheek.
