Vai al contenuto

Il protocollo AMQP

AMQP, che sta per Advanced Message Queuing Protocol, è uno standard aperto per la messaggistica tra applicazioni. È stato progettato per garantire:

  • affidabilità nella consegna dei messaggi;
  • interoperabilità tra linguaggi e piattaforme;
  • supporto a sistemi distribuiti e scalabili;
  • gestione delle code e routing dei messaggi in maniera robusta.

Architettura e componenti di AMQP

Il protocollo AMQP definisce chiaramente il comportamento dei broker di messaggi. I componenti principali sono:

  • Producer: il produttore di messaggi che invia messaggi al broker.
  • Exchange: riceve i messaggi dai producer e decide come instradarli alle code.
  • Queue: coda che conserva i messaggi finché un consumer non li legge.
  • Consumer: legge i messaggi dalla queue e li elabora.
  • Binding: associa exchange e queue e definisce regole di routing.
  • Routing Key: chiave che determina a quale coda inviare il messaggio.

La comunicazione avviene attraverso canali logici che viaggiano sopra una connessione TCP. Questo consente di avere più flussi paralleli senza aprire nuove connessioni fisiche per ogni canale.

Tipi di Exchange AMQP

AMQP definisce diversi tipi di exchange, ciascuno con un comportamento specifico:

  • Direct Exchange: instrada i messaggi alle queue in base a una routing key esatta.
  • Fanout Exchange: invia il messaggio a tutte le queue collegate, ignorando la routing key.
  • Topic Exchange: instrada i messaggi secondo pattern sulla routing key, utile per filtrare messaggi con wildcard.
  • Headers Exchange: instradamento basato su header dei messaggi, piuttosto che sulla routing key.
  • Direct Exchange (Diretto): Invia i messaggi alle code basandosi sull’esatta corrispondenza tra la routing key del messaggio e la binding key della coda. È ideale per il routing unicast (punto-punto).

  • Fanout Exchange (Broadcast): Invia una copia di ogni messaggio a tutte le code collegate (bindate), ignorando completamente la routing key. Ideale per scenari di broadcasting.

  • Topic Exchange (Argomento): Instrada i messaggi alle code basandosi su una corrispondenza parziale o con metacaratteri (wildcard) tra la routing key e il pattern della binding key. Permette un routing complesso e flessibile (es. app.* o app.service.#).
    Esempi di utilizzo:

    • Distribuzione di dati rilevanti per una posizione geografica specifica, ad esempio punti vendita
    • Elaborazione delle attività in background eseguita da più lavoratori, ognuno in grado di gestire un insieme specifico di attività
    • Aggiornamenti sui prezzi delle azioni (e aggiornamenti su altri tipi di dati finanziari)
    • Aggiornamenti di notizie che implicano categorizzazione o tag (ad esempio, solo per uno sport o una squadra in particolare)
    • Orchestrazione di servizi di diverso tipo nel cloud
    • Build o pacchetti software specifici per architettura/sistema operativo distribuiti in cui ogni builder può gestire solo un’architettura o un sistema operativo
  • Headers Exchange (Intestazioni): Utilizza gli attributi dell’header del messaggio, invece della routing key, per l’instradamento. Le code si legano all’exchange definendo criteri basati sui valori degli header (es. match di tutti o uno degli header). 

Questi tipi consentono di implementare facilmente diversi pattern di messaging, come pub/sub, code di lavoro bilanciate, e sistemi di notifiche mirate.

Garantire l’affidabilità dei messaggi

AMQP fornisce strumenti per garantire che i messaggi non vadano persi e vengano processati correttamente:

  • Message Acknowledgment (ACK): il consumer conferma la ricezione del messaggio; il broker lo elimina dalla queue solo dopo l’ACK.
  • Durable Queues: le queue persistono anche se RabbitMQ viene riavviato.
  • Persistent Messages: i messaggi possono essere marcati come persistenti per essere scritti su disco.
  • Dead Letter Exchange: messaggi non processati correttamente possono essere instradati a una queue di errore.

Canali e connessioni

AMQP distingue tra connessione e canale:

  • Connessione: una connessione TCP tra client e broker.
  • Canale: flusso logico all’interno della connessione, usato per inviare e ricevere messaggi.

Utilizzare più canali su una singola connessione è efficiente perché riduce l’overhead di apertura/chiusura delle connessioni TCP, fondamentale nei sistemi ad alta concorrenza.

Pattern comuni con AMQP

AMQP consente di implementare diversi pattern di messaggistica:

  • Work Queue: più consumer processano messaggi da una stessa queue, bilanciando il carico.
  • Publish/Subscribe: un producer invia a un fanout exchange; tutti i consumer ricevono il messaggio.
  • Routing: direct exchange con routing key specifiche indirizza messaggi a queue selezionate.
  • Topic Routing: topic exchange con wildcard consente filtraggio avanzato.

Messaggi e header

Ogni messaggio AMQP è composto da:

  • Header: metadati, come routing key, tipo, priorità, TTL.
  • Body: contenuto vero e proprio, tipicamente JSON o binario.

Grazie agli header è possibile implementare funzionalità avanzate come delay, retry o priorità, senza modificare il corpo del messaggio.

Come Symfony Messenger usa AMQP?

Symfony Messenger sfrutta AMQP (tramite RabbitMQ) per inviare i messaggi in modo asincrono:

  • Ogni Message in Symfony diventa un payload inviato all’exchange AMQP.
  • Il tipo del messaggio può essere indicato come header.
  • I consumer Symfony leggono i messaggi dalla queue e li trasformano in oggetti PHP da elaborare.

Questo approccio mantiene la comunicazione robusta e tipizzata tra producer e consumer.

Vantaggi del protocollo AMQP

  • Affidabilità e garanzia di consegna dei messaggi.
  • Separazione chiara tra componenti del sistema.
  • Supporto a sistemi distribuiti e scalabili.
  • Flessibilità nel routing dei messaggi.
  • Standard aperto e indipendente dal linguaggio.

Conclusione

AMQP è la base di RabbitMQ e di molti broker professionali. Comprendere il protocollo aiuta a progettare code robuste, scegliere il tipo di exchange corretto e gestire correttamente messaggi, queue e consumer. Integrando AMQP con Symfony Messenger si ottiene un sistema moderno, scalabile e affidabile.