Kafka 提供了重試機(jī)制和 ACK(Acknowledgement)機(jī)制來確保消息的可靠性和一致性。
重試機(jī)制:
1. 在生產(chǎn)者端,當(dāng)消息發(fā)送失敗時(shí),生產(chǎn)者可以選擇進(jìn)行重試。生產(chǎn)者會(huì)根據(jù)配置的重試次數(shù)和重試間隔,自動(dòng)嘗試重新發(fā)送消息。
2. 如果在指定的重試次數(shù)內(nèi)仍然無法成功發(fā)送消息,生產(chǎn)者可以選擇將消息寫入錯(cuò)誤日志或執(zhí)行自定義的錯(cuò)誤處理邏輯。
ACK機(jī)制:
1. 在生產(chǎn)者端,生產(chǎn)者發(fā)送消息到 Kafka 集群時(shí),可以設(shè)置 `acks` 參數(shù)來控制 ACK 機(jī)制的行為。`acks` 參數(shù)有以下幾種取值:
- `acks=0`:生產(chǎn)者不等待來自服務(wù)器的任何確認(rèn),直接發(fā)送下一條消息。這種方式下,存在消息丟失的風(fēng)險(xiǎn)。
- `acks=1`:生產(chǎn)者在消息寫入主副本后,會(huì)收到服務(wù)器的確認(rèn)消息。這種方式下,主副本寫入成功后即可返回 ACK,但是如果主副本在確認(rèn)前發(fā)生故障,消息可能會(huì)丟失。
- `acks=all`(或`acks=-1`):生產(chǎn)者在消息寫入主副本和所有副本后,會(huì)收到服務(wù)器的確認(rèn)消息。這種方式下,只有當(dāng)所有副本都寫入成功后,才會(huì)返回 ACK,保證了消息的持久性和可靠性。
2. 在消費(fèi)者端,消費(fèi)者消費(fèi)消息時(shí),可以使用手動(dòng)提交 ACK 的方式。消費(fèi)者從 Kafka 獲取消息后,可以處理完消息后手動(dòng)提交 ACK,告知 Kafka 該消息已被消費(fèi),以便 Kafka 知道可以將其視為已消費(fèi)并進(jìn)行偏移量的管理。如果消費(fèi)者未提交 ACK,Kafka 將會(huì)認(rèn)為消息未被成功消費(fèi),并在適當(dāng)?shù)臅r(shí)候重新分配給其他消費(fèi)者。
通過重試機(jī)制和 ACK 機(jī)制的配合使用,Kafka 可以提供可靠的消息傳遞保證。生產(chǎn)者的重試機(jī)制可以處理發(fā)送失敗的情況,而 ACK 機(jī)制可以確保消息在集群中的持久性和可靠性,同時(shí)消費(fèi)者的 ACK 提交可以確保消息被正確消費(fèi)。這樣,Kafka 可以保證消息不會(huì)丟失,并提供至少一次的傳遞保證(at least once)。