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.
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.
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).
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.
# 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)
}
});
```
[ ] 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'