Sobes.tech
Junior — Middle

Come memorizza il consumatore in Kafka la sua posizione nel flusso di dati?

sobes.tech AI

Risposta dell'AI

In Apache Kafka, il consumatore memorizza la sua posizione nel flusso di dati tramite gli offset. L'offset è il numero di ordine del messaggio nella partizione di un topic.

Il consumer effettua periodicamente un commit (salvataggio) dell'offset corrente, per poter riprendere la lettura dal punto giusto in caso di riavvio o errore. Il commit può essere automatico (auto-commit) o manuale.

Nei client Kafka in Go (ad esempio, sarama), l'offset viene generalmente salvato in un topic speciale __consumer_offsets, gestito dallo stesso Kafka. Questo permette a più consumer di un gruppo di coordinare la lettura e garantire che ogni messaggio venga processato una sola volta.

Esempio di commit manuale di offset in Go usando sarama:

partitionConsumer, _ := consumer.ConsumePartition(topic, partition, sarama.OffsetNewest)

for msg := range partitionConsumer.Messages() {
    // elaborazione del messaggio
    fmt.Println(string(msg.Value))
    // commit dell'offset
    consumer.MarkOffset(msg, "")
}

In questo modo, la posizione del consumer nel flusso è l'ultimo offset committato, che viene memorizzato in Kafka e permette di riprendere la lettura dal punto giusto.