Kafka — Cheat Sheet

Tag: kafka, message-broker, event-streaming, pub-sub, topics, partitions, consumer-groups

Livello: intermedio

TL;DR: Apache Kafka è una piattaforma di event streaming distribuita. Eccelle nel gestire enormi volumi di dati in tempo reale tramite un modello publish-subscribe basato su log immutabili.

Concetti chiave

Il cluster è formato da nodi server chiamati Broker.

I messaggi sono categorizzati in Topic, che fungono da logiche code di eventi.

I Topic sono divisi in Partitions per scalare la lettura e scrittura su più Broker.

L'ordinamento dei messaggi è garantito esclusivamente all'interno della singola partizione, non a livello di Topic.

I Producer pubblicano messaggi; i Consumer li sottoscrivono e leggono al proprio ritmo.

Un Consumer Group permette a più Consumer di dividersi il carico di lavoro delle partizioni di un Topic.

L'Offset è l'indice numerico che traccia la posizione di lettura di un Consumer in una specifica partizione.

La Retention Policy definisce per quanto tempo o per quale limite di spazio i messaggi vengono conservati prima di essere scartati.

Zookeeper (o recentemente KRaft) gestisce lo stato del cluster, i metadati e l'elezione dei leader.

Domande tipiche e risposte pronte

Q: Come garantisci che determinati messaggi vengano elaborati in ordine?R: Associo una message key al momento della produzione. Kafka instraderà tutti i messaggi con la stessa chiave nella stessa partizione, mantenendone l'ordine cronologico.

Q: Cosa succede se un nodo Consumer crasha all'interno di un Consumer Group?R: Avviene un rebalance automatico. Il cluster si accorge del timeout e riassegna le partizioni del nodo fallito agli altri Consumer attivi del gruppo.

Q: Qual è la differenza principale tra Kafka e RabbitMQ?R: RabbitMQ si basa su code effimere ed elimina i messaggi dopo la lettura. Kafka salva i dati in un log persistente su disco, permettendo riletture multiple.

Insidie e errori comuni

Usare l'auto-commit degli offset: se l'elaborazione fallisce dopo il commit automatico, il messaggio viene perso. Eseguo sempre il commit manuale post-elaborazione.

Configurare più Consumer in un gruppo rispetto al numero di Partitions del Topic: i Consumer in eccesso rimarranno inattivi.

Non gestire correttamente i messaggi corrotti ("poison pill"), causando loop infiniti e bloccando l'avanzamento dell'offset sulla partizione.

Snippet e comandi

# Creare un topic con 3 partizioni
kafka-topics.sh --create --topic my-topic --partitions 3 --replication-factor 2 --bootstrap-server localhost:9092

# Produrre messaggi da console
kafka-console-producer.sh --topic my-topic --bootstrap-server localhost:9092

# Consumare messaggi partendo dal primo disponibile (offset 0)
kafka-console-consumer.sh --topic my-topic --from-beginning --bootstrap-server localhost:9092

# Controllare lo stato e il lag di un Consumer Group
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-group

Da ripassare

[ ] Dettagli sull'architettura KRaft per rimpiazzare Zookeeper

[x] Dinamiche di Rebalancing e partizionamento a livello di Consumer Group

Jarvis Interviews
Jarvis