Junior — Middle
Kafkaда билдирүүлөрдү кеминде бир жолу жеткирүү мүмкүнчүлүгү кандай камсыздалат?
sobes.tech AI
AIден жооп
Apache Kafkaда билдирүүлөрдү кеминде бир жолу жеткирүү механизмдери (acknowledgments) жана offsets (offsets) башкаруу аркылуу камсыздалган.
Процесс төмөндөгүчө:
- Продуцент Kafkaга билдирүү жөнөтөт жана брокерден ырастоону күтөт (мисалы, ack=all — бардык репликалардан ырастоо).
- Билдирүү брокердин журналында сакталат.
- Консуматор билдирүүнү окуп, ийгиликтүү иштеткенден кийин, Kafkaга offsets (offsets) боюнча ырастоону (commit) жөнөтөт.
Эгер консуматор иштебей калса, кайра иштеткенде билдирүүнү кайра окуйт, бул "кеминде бир жолу" жеткирүүнү камсыздайт.
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
}
Эгер ырастоо жөнөтүлбөсө, билдирүү кайра жеткирилет.