Da sgcWebSockets 2024.2.0 AMQP 1.0.0 è supportato.
AMQP (Advanced Message Queuing Protocol) 1.0.0 è un protocollo di messaggistica progettato per comunicazioni affidabili e asincrone tra sistemi distribuiti. Facilita lo scambio di messaggi tra applicazioni o componenti in modo disaccoppiato, permettendo loro di comunicare senza dipendenze dirette.
Nel complesso, AMQP 1.0.0 offre un modo standardizzato e interoperabile per far comunicare componenti software e sistemi diversi in modo loosely coupled, rendendolo adatto a diverse applicazioni distribuite e di livello enterprise.
Funzionalità di AMQP
- Comunicazione orientata ai messaggi: AMQP 1.0.0 è incentrato sul concetto di messaggio. I messaggi possono trasportare dati, istruzioni o comandi e sono le unità fondamentali di comunicazione.
- Message Broker: il protocollo si basa su un modello di messaggistica con broker. I broker, che possono essere server o entità intermediarie, gestiscono l'instradamento e la consegna dei messaggi tra produttori e consumatori.
- Code ed exchange: le code sono entità di storage all'interno del broker dove i messaggi vengono temporaneamente memorizzati. Gli exchange definiscono le regole per instradare i messaggi dai produttori alle code in base a criteri come contenuto del messaggio o routing key.
- Indirizzi e link: gli indirizzi identificano le destinazioni dei messaggi all'interno dell'infrastruttura. I link sono canali di comunicazione tra un mittente (produttore) e un destinatario (consumatore) associati a un indirizzo specifico.
- Sessioni e connessioni: le sessioni rappresentano un canale logico di comunicazione e consentono di avere più flussi di messaggi in un'unica connessione. Le connessioni gestiscono il collegamento di comunicazione complessivo tra le applicazioni client e il message broker.
- Sicurezza: AMQP 1.0.0 supporta diversi meccanismi di sicurezza, inclusi autenticazione e autorizzazione, per garantire comunicazioni sicure tra client e broker.
- Indipendenza dal trasporto: il protocollo è progettato per essere agnostico rispetto al trasporto, potendo operare su diversi trasporti di rete come TCP, TLS o WebSockets, offrendo flessibilità nel deployment.
- Controllo di flusso: AMQP 1.0.0 include meccanismi di flow control che permettono ai consumatori di indicare la propria capacità di gestire i messaggi in arrivo a una certa frequenza. Questo aiuta a evitare di sovraccaricare i consumatori con un grande numero di messaggi.
- Gestione degli errori: il protocollo specifica meccanismi per la gestione degli errori, incluse la conferma e la reiezione dei messaggi, garantendo robustezza e affidabilità nella consegna.
- Autenticazione SASL: Simple Authentication and Security Layer (SASL) viene usato per autenticare e mettere in sicurezza le connessioni tra client e broker.
Configurazione
Il client AMQP 1.0.0 ha la proprietà AMQPOptions tramite cui configurare la connessione.
- ChannelMax: il valore channel-max è il numero di canale più alto utilizzabile sulla connessione. Questo
valore più uno è il numero massimo di sessioni contemporaneamente attive sulla
connessione. - ContainerId: (opzionale) è il nome del container di origine, identifica in modo univoco la connessione sul server.
- CreditSize: dimensione predefinita del flusso di credit.
- IdleTimeout: il timeout viene attivato da un peer locale quando non vengono ricevuti frame
per un valore superiore a una soglia. L'idle timeout è misurato in millisecondi e parte
dal momento in cui è stato ricevuto l'ultimo frame. - MaxFrameSize: la dimensione massima accettata del frame.
- MaxLinksPerSession: il numero massimo di link per sessione.
- WindowSize: la dimensione predefinita della finestra.
L'autenticazione AMQP deve essere configurata nella proprietà Authentication.
- AuthType: tipo di autenticazione
- amqp1authNone: non configurata.
- amqp1authSASLAnonymous: autenticazione anonima.
- amqp1authSASLPlain: autenticazione user/password. Questo tipo di autenticazione richiede di compilare le seguenti proprietà:
- Username
- Password
- amqp1authSASLExternal: autenticazione esterna.
Connessione
La connessione inizia con il client (di solito un'applicazione o un servizio di messaggistica) che apre una connessione TCP al server (il message broker). Il client si connette alla porta del server, tipicamente 5672 per connessioni non TLS e 5671 per connessioni protette TLS. Una volta stabilita la connessione TCP, client e server negoziano la versione del protocollo AMQP da usare. AMQP 1.0.0 supporta diverse versioni e, durante la negoziazione, entrambi concordano nell'usare la versione 1.0.0.
Dopo la negoziazione del protocollo, il client potrebbe dover autenticarsi al server, a seconda della configurazione di quest'ultimo. I meccanismi di autenticazione possono includere SASL (Simple Authentication and Security Layer) come PLAIN, EXTERNAL o altri supportati dal server.
Esempio: connessione a un server AMQP in ascolto sulla porta sicura 5671 usando credenziali 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;
Sessioni
Una volta autenticato, il client apre una sessione AMQP. Una sessione è un contesto logico di comunicazione tra client e server. Le sessioni servono a raggruppare operazioni di messaggistica correlate. Usa il metodo CreateSession per creare una nuova sessione; il metodo permette di impostare il nome della sessione o di lasciarlo vuoto, e il componente ne assegnerà uno automaticamente.
Se la sessione è stata creata correttamente, l'evento OnAMQPSessionOpen verrà sollevato con i dettagli della sessione.
AMQP1.CreateSession('MySession');
procedure AMQP1AMQPSessionOpen(Sender: TObject; const aSession: TsgcAMQP1Session;
const aBegin: TsgcAMQP1FrameBegin);
begin
ShowMessage('#session-open: ' + aSession.Id);
end;
Link
All'interno di una sessione, il client crea dei link per comunicare con entità specifiche come code, topic o altre risorse fornite dal server. I link sono canali di comunicazione bidirezionali usati per inviare e ricevere messaggi.
Il componente può funzionare come nodo mittente e ricevente. Permette di creare un numero qualunque di link per ogni sessione, fino al limite impostato nella proprietà MaxLinksPerSession.
Sender Link
Per creare un nuovo sender link, usa il metodo CreateSenderLink e passa il nome della sessione e opzionalmente il nome del sender link. Se il link viene creato correttamente, viene sollevato l'evento 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;
Receiver Link
Per creare un nuovo receiver link, usa il metodo CreateReceiverLink e passa il nome della sessione e opzionalmente il nome del receiver link. Se il link viene creato correttamente, viene sollevato l'evento 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;
Inviare messaggi
Una volta stabilita la sessione e creati i link, il client può iniziare a eseguire operazioni sui messaggi, ad esempio inviarli a una destinazione. Usa il metodo SendMessage per inviare un messaggio tramite un sender link.
AMQP1.SendMessage('MySession', 'MySenderLink', 'My first AMQP Message');
Leggere messaggi
Per impostazione predefinita i Receiver Link vengono creati in modalità Automatica, il che significa che ogni volta che arriva un nuovo messaggio questo viene consegnato al client.
Se i Receiver Link sono stati creati in modalità manuale, usa il metodo sincrono GetMessage per fare il fetch e attendere l'arrivo di un nuovo messaggio.
In modalità Automatica e Manuale, ogni volta che arriva un nuovo messaggio viene sollevato l'evento OnAMQPMessage.
procedure OnAMQPMessageEvent(Sender: TObject; const aSession:
TsgcAMQP1Session; const aLink: TsgcAMQP1ReceiverLink; const aMessage:
TsgcAMQP1Message; var DeliveryState: TsgcAMQP1MessageDeliveryState);
begin
ShowMessage(aMessage.ApplicationData.AMQPValue.Value);
end;
Documentazione
AMQP1 Delphi Client
Scopri di più sul client AMQP 1.0.0 per Delphi / C++ Builder https://www.esegece.com/help/sgcWebSockets/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htmScarica la demo
Scarica la demo del client AMQP 1.0.0 compilata per Windows con la libreria sgcWebSockets.
