Sobes.tech
Junior — Middle

Πώς διασφαλίζεται η δυνατότητα παράδοσης μηνυμάτων τουλάχιστον μία φορά στο Kafka;

sobes.tech AI

Απάντηση από AI

Στο Apache Kafka, η παράδοση μηνυμάτων με εγγύηση "τουλάχιστον μία φορά" διασφαλίζεται μέσω του μηχανισμού επιβεβαιώσεων (acknowledgments) και της διαχείρισης των offsets.

Η διαδικασία έχει ως εξής:

  1. Ο παραγωγός στέλνει ένα μήνυμα στο Kafka και περιμένει την επιβεβαίωση από τον broker (π.χ., ack=all — επιβεβαίωση από όλες τις αναπαραγωγές).
  2. Το μήνυμα αποθηκεύεται στο αρχείο καταγραφής (logs) του broker.
  3. Ο καταναλωτής διαβάζει το μήνυμα και, μετά από επιτυχημένη επεξεργασία, στέλνει μια επιβεβαίωση (commit) του offset στο Kafka.

Αν ο καταναλωτής καταρρεύσει πριν από την επιβεβαίωση, κατά την επανεκκίνηση θα διαβάσει ξανά το μήνυμα, διασφαλίζοντας την παράδοση "τουλάχιστον μία φορά".

Παράδειγμα σε Go με τη βιβλιοθήκη sarama:

consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// Στον χειριστή μηνυμάτων:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
    for message := range claim.Messages() {
        process(message) // επεξεργασία μηνύματος
        sess.MarkMessage(message, "") // επιβεβαίωση επεξεργασίας
    }
    return nil
}

Έτσι, αν η επιβεβαίωση δεν σταλεί, το μήνυμα θα παραδοθεί ξανά.