Od sgcWebSockets 2024.2.0 obsługiwany jest AMQP 1.0.0.
AMQP (Advanced Message Queuing Protocol) 1.0.0 to protokół wiadomości zaprojektowany z myślą o niezawodnej, asynchronicznej komunikacji między systemami rozproszonymi. Ułatwia wymianę wiadomości między aplikacjami i komponentami w sposób odseparowany, pozwalając im komunikować się bez bezpośrednich zależności.
Ogólnie rzecz biorąc, AMQP 1.0.0 zapewnia ustandaryzowany i interoperacyjny sposób komunikacji różnych komponentów i systemów w luźno powiązany sposób, dzięki czemu sprawdza się w wielu zastosowaniach rozproszonych i na poziomie korporacyjnym.
Funkcje AMQP
- Komunikacja zorientowana na wiadomości: AMQP 1.0.0 jest zbudowany wokół koncepcji wiadomości. Wiadomości mogą przenosić dane, instrukcje lub polecenia i są podstawowymi jednostkami komunikacji.
- Brokerzy wiadomości: protokół działa w modelu pośredniczonej wymiany wiadomości. Brokerzy, którymi mogą być serwery lub jednostki pośredniczące, zarządzają trasowaniem i dostarczaniem wiadomości między producentami a konsumentami.
- Kolejki i wymiany: kolejki to elementy w brokerze, w których wiadomości są tymczasowo przechowywane. Wymiany definiują reguły trasowania wiadomości od producentów do kolejek na podstawie kryteriów takich jak treść wiadomości lub klucze trasowania.
- Adresy i łącza: adresy identyfikują miejsca docelowe wiadomości w infrastrukturze. Łącza to kanały komunikacyjne między nadawcą (producentem) a odbiorcą (konsumentem) powiązane z konkretnym adresem.
- Sesje i połączenia: sesje reprezentują logiczny kanał komunikacji, pozwalający na wiele strumieni wiadomości w obrębie pojedynczego połączenia. Połączenia zarządzają ogólnym łączem komunikacyjnym między aplikacjami klienckimi a brokerem.
- Bezpieczeństwo: AMQP 1.0.0 obsługuje różne mechanizmy bezpieczeństwa, w tym uwierzytelnianie i autoryzację, zapewniając bezpieczną komunikację między klientami a brokerami.
- Niezależność od transportu: protokół zaprojektowano jako niezależny od warstwy transportowej, dzięki czemu może działać po różnych transportach sieciowych, takich jak TCP, TLS czy WebSocket, co zapewnia elastyczność wdrażania.
- Kontrola przepływu: AMQP 1.0.0 zawiera mechanizmy kontroli przepływu, pozwalające konsumentom wskazać, w jakim tempie są w stanie obsługiwać przychodzące wiadomości. Zapobiega to przeciążaniu konsumentów dużą liczbą wiadomości.
- Obsługa błędów: protokół definiuje mechanizmy obsługi błędów, w tym potwierdzanie i odrzucanie wiadomości, zapewniając solidność i niezawodność dostarczania.
- Uwierzytelnianie SASL: Simple Authentication and Security Layer (SASL) służy do uwierzytelniania i zabezpieczania połączeń między klientami a brokerami.
Konfiguracja
Klient AMQP 1.0.0 udostępnia właściwość AMQPOptions, w której konfigurujesz połączenie.
- ChannelMax: wartość channel-max to najwyższy numer kanału, jakiego można użyć w danym połączeniu. Ta
wartość plus jeden to maksymalna liczba sesji, które mogą być jednocześnie aktywne w
połączeniu. - ContainerId: (opcjonalnie) nazwa kontenera źródłowego, jednoznacznie identyfikująca połączenie na serwerze.
- CreditSize: domyślny rozmiar przepływu kredytów.
- IdleTimeout: limit czasu wyzwalany przez lokalnego uczestnika, gdy przez
okres dłuższy niż próg nie otrzymano żadnych ramek. Limit jest mierzony w milisekundach i liczony od
momentu odebrania ostatniej ramki. - MaxFrameSize: maksymalny akceptowany rozmiar ramki.
- MaxLinksPerSession: maksymalna liczba łączy na sesję.
- WindowSize: domyślny rozmiar okna.
Uwierzytelnianie AMQP konfigurujesz we właściwości Authentication.
- AuthType: typ uwierzytelniania
- amqp1authNone: nieskonfigurowane.
- amqp1authSASLAnonymous: uwierzytelnianie anonimowe
- amqp1authSASLPlain: uwierzytelnianie użytkownik/hasło. Ten typ wymaga wypełnienia następujących właściwości:
- Username
- Password
- amqp1authSASLExternal: uwierzytelnianie zewnętrzne
Połączenie
Połączenie zaczyna się od tego, że klient (zazwyczaj aplikacja lub usługa wymiany wiadomości) inicjuje połączenie TCP do serwera (brokera wiadomości). Klient łączy się z portem serwera — zwykle 5672 dla połączeń bez TLS i 5671 dla połączeń zabezpieczonych TLS. Po nawiązaniu połączenia TCP klient i serwer negocjują wersję protokołu AMQP, której będą używać. AMQP 1.0.0 obsługuje różne wersje, a podczas negocjacji obie strony uzgadniają użycie wersji 1.0.0.
Po negocjacji protokołu klient może musieć się uwierzytelnić wobec serwera, w zależności od konfiguracji serwera. Mechanizmy uwierzytelniania mogą obejmować mechanizmy SASL (Simple Authentication and Security Layer) takie jak PLAIN, EXTERNAL lub inne obsługiwane przez serwer.
Przykład: połączenie z serwerem AMQP nasłuchującym na bezpiecznym porcie 5671 z użyciem poświadczeń SASL
// 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;
Sesje
Po uwierzytelnieniu klient otwiera sesję AMQP. Sesja to logiczny kontekst komunikacji między klientem a serwerem. Sesje służą do grupowania powiązanych operacji wymiany wiadomości. Aby utworzyć nową sesję, użyj metody CreateSession; metoda pozwala podać nazwę sesji lub pozostawić ją pustą — wtedy komponent przypisze ją automatycznie.
Jeśli sesja została utworzona pomyślnie, zostanie wywołane zdarzenie OnAMQPSessionOpen ze szczegółami sesji.
AMQP1.CreateSession('MySession');
procedure AMQP1AMQPSessionOpen(Sender: TObject; const aSession: TsgcAMQP1Session;
const aBegin: TsgcAMQP1FrameBegin);
begin
ShowMessage('#session-open: ' + aSession.Id);
end;
Łącza
W obrębie sesji klient tworzy łącza, aby komunikować się z konkretnymi obiektami, takimi jak kolejki, tematy lub inne zasoby udostępniane przez serwer. Łącza to dwukierunkowe kanały komunikacyjne służące do wysyłania i odbierania wiadomości.
Komponent może działać jako węzeł nadawcy i odbiorcy. Pozwala utworzyć dowolną liczbę łączy dla każdej sesji, aż do limitu określonego we właściwości MaxLinksPerSession.
Łącza nadawcze
Aby utworzyć nowe łącze nadawcze, użyj metody CreateSenderLink i przekaż nazwę sesji oraz opcjonalnie nazwę łącza. Jeśli łącze zostanie utworzone pomyślnie, zostanie wywołane zdarzenie OnAMQPLinkOpen.
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;
Łącza odbiorcze
Aby utworzyć nowe łącze odbiorcze, użyj metody CreateReceiverLink i przekaż nazwę sesji oraz opcjonalnie nazwę łącza. Jeśli łącze zostanie utworzone pomyślnie, zostanie wywołane zdarzenie OnAMQPLinkOpen.
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;
Wysyłanie wiadomości
Po nawiązaniu sesji i utworzeniu łączy klient może rozpocząć operacje na wiadomościach, np. wysyłanie wiadomości do miejsca docelowego. Aby wysłać wiadomość przez łącze nadawcze, użyj metody SendMessage.
AMQP1.SendMessage('MySession', 'MySenderLink', 'My first AMQP Message');
Odbieranie wiadomości
Domyślnie łącza odbiorcze są tworzone w trybie automatycznym, co oznacza, że każda nowa wiadomość będzie dostarczana do klienta.
Jeśli łącze odbiorcze utworzono w trybie ręcznym, użyj synchronicznej metody GetMessage, aby pobrać wiadomość i poczekać na nadejście kolejnej.
Zarówno w trybie automatycznym, jak i ręcznym przy każdej nowej wiadomości wywoływane jest zdarzenie OnAMQPMessage.
procedure OnAMQPMessageEvent(Sender: TObject; const aSession:
TsgcAMQP1Session; const aLink: TsgcAMQP1ReceiverLink; const aMessage:
TsgcAMQP1Message; var DeliveryState: TsgcAMQP1MessageDeliveryState);
begin
ShowMessage(aMessage.ApplicationData.AMQPValue.Value);
end;
Dokumentacja
Klient AMQP1 dla Delphi
Dowiedz się więcej o kliencie AMQP 1.0.0 dla Delphi / C++ Builder https://www.esegece.com/help/sgcWebSockets/pl/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htmPobierz demo
Pobierz demonstracyjnego klienta AMQP 1.0.0 skompilowanego dla Windows z użyciem biblioteki sgcWebSockets.
