Junior — Middle
Πώς διασφαλίζεται η δυνατότητα παράδοσης μηνυμάτων τουλάχιστον μία φορά στο Kafka;
sobes.tech AI
Απάντηση από AI
Στο Apache Kafka, η παράδοση μηνυμάτων με εγγύηση "τουλάχιστον μία φορά" διασφαλίζεται μέσω του μηχανισμού επιβεβαιώσεων (acknowledgments) και της διαχείρισης των offsets.
Η διαδικασία έχει ως εξής:
- Ο παραγωγός στέλνει ένα μήνυμα στο Kafka και περιμένει την επιβεβαίωση από τον broker (π.χ., ack=all — επιβεβαίωση από όλες τις αναπαραγωγές).
- Το μήνυμα αποθηκεύεται στο αρχείο καταγραφής (logs) του broker.
- Ο καταναλωτής διαβάζει το μήνυμα και, μετά από επιτυχημένη επεξεργασία, στέλνει μια επιβεβαίωση (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
}
Έτσι, αν η επιβεβαίωση δεν σταλεί, το μήνυμα θα παραδοθεί ξανά.