Messaging RabbitMQ — Cheat Sheet

Tag: rabbitmq, amqp, messaging, event-driven, microservices, distributed-systems

Livello: intermedio

TL;DR: Message broker basato su standard AMQP per disaccoppiamento asincrono, gestione code, routing flessibile e affidabilita' di consegna dei messaggi.

Concetti chiave

Broker orientato ai messaggi: disaccoppia produttori e consumatori tramite code gestite centralmente.

Implementa nativamente il protocollo AMQP 0-9-1 con supporto esteso ad altri protocolli tramite plugin.

Architettura a tre elementi base: Exchange (riceve), Queue (memorizza), Binding (definisce il percorso di routing).

Exchange Direct: instrada i messaggi confrontando l'esatta routing key con la binding key.

Exchange Fanout: ignora la routing key e replica a broadcast il messaggio su tutte le code collegate.

Exchange Topic: supporta pattern di matching con caratteri jolly (* singola parola, # zero o piu' parole).

Exchange Headers: routing basato sugli attributi dell'header del messaggio anziche' sulla routing key.

Garanzie di consegna: ack manuale o automatico per confermare l'elaborazione prima della rimozione dalla coda.

Durabilita' e persistenza: code e messaggi possono essere salvati su disco per tollerare riavvii del broker.

Prefetch count: regola la quantita' di messaggi non confermati inviati a un singolo consumatore.

Domande tipiche e risposte pronte

Q: Qual e' la differenza sostanziale tra RabbitMQ e Apache Kafka?R: RabbitMQ e' un broker di messaggi tradizionale "smart broker / dumb consumer" basato su code volatili o persistenti che rimuove i messaggi dopo il consumo; Kafka e' un log distribuito ad alto throughput che mantiene la storia immutabile e delega lo stato dell'offset ai consumatori.

Q: Come si gestisce la perdita di messaggi in RabbitMQ?R: Abilito Publisher Confirms lato producer, dichiaro code e exchange durevoli, imposto la modalita' di persistenza sui singoli messaggi e gestisco manualmente gli ACK lato consumer solo al termine dell'elaborazione.

Q: Cosa succede se un consumatore fallisce l'elaborazione di un messaggio?R: Invia un nack o reject; posso richiedere il requeue immediato oppure, preferibilmente, instradarlo automaticamente verso una Dead Letter Exchange (DLX) per analisi degli errori ed evitare loop infiniti.

Q: A cosa serve il parametro prefetch count (QoS)?R: Serve a evitare che il broker sovraccarichi un singolo worker con messaggi che non riesce a smaltire, distribuendo il carico in modo bilanciato ed efficiente (fair dispatch).

Insidie e errori comuni

Usare auto-ack=true con conseguente perdita definitiva di messaggi in caso di crash improvviso del consumer.

Dimenticare di configurare una Dead Letter Queue (DLQ), provocando crash continui su messaggi malformati o velenosi.

Confondere la durabilita' della coda (durable=true) con la persistenza del messaggio (delivery_mode=2).

Riempire la memoria RAM configurando code senza limiti o consumatori troppo lenti, innescando il blocco dei producer per memory alarm.

Dichiarare connessioni e canali separati per ogni singolo messaggio anziche' riutilizzare pool di connessioni a lungo termine.

Snippet e comandi

# Avvio di RabbitMQ con interfaccia di management su Docker
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

# Controllo dello stato del cluster e delle code
rabbitmqctl status
rabbitmqadmin list queues vhost name messages consumers

TypeScript

```import amqp from 'amqplib';

// Connessione, dichiarazione coda durable e consumo con manual ack

const connection = await amqp.connect('amqp://localhost');

const channel = await connection.createChannel();

const queue = 'task_queue';

await channel.assertQueue(queue, { durable: true });

await channel.prefetch(1);

channel.consume(queue, async (msg) => {

if (!msg) return;

try {

const content = JSON.parse(msg.content.toString());

// elaborazione logica applicativa

channel.ack(msg);

} catch (err) {

channel.nack(msg, false, false); // rifiuto e invio a DLQ (requeue=false)

}

});

```

Da ripassare

[ ] Configurazione policy e argomenti avanzati per Dead Letter Exchange (x-dead-letter-exchange)

[ ] Algoritmi di ripartizione e clustering con Quorum Queues rispetto alle code con mirroring classico

[ ] Implementazione e semantica dei Publisher Confirms in scenari ad alta affidabilita'

Jarvis Interviews
Jarvis