請解釋一下什麼是Kafka的acks策略

姚春辉發表於2024-12-04

Kafka的acks(acknowledgements)策略是生產者(Producer)在傳送訊息到Kafka叢集時,用於控制訊息持久化和確認機制的重要配置。這個策略決定了生產者何時認為一條訊息已經被成功傳送。

Kafka提供了三種acks策略,它們分別對應不同的可靠性和效能權衡:

  1. acks=0
    • 在這種模式下,生產者不會等待任何來自Kafka叢集的確認。訊息一旦從生產者發出,生產者就認為這條訊息已經被成功傳送,並立即繼續傳送下一條訊息。
    • 這種模式提供了最低的訊息持久化保證和最高的吞吐量,因為生產者不需要等待任何確認。但是,它也是最不可靠的,因為如果訊息在傳輸過程中丟失或者Broker在寫入訊息之前崩潰,那麼這條訊息就會丟失。
  2. acks=1(或acks=leader):
    • 在這種模式下,生產者會等待Kafka叢集中的主副本(Leader)確認訊息已經被成功寫入日誌。一旦Leader確認了訊息,生產者就認為這條訊息已經被成功傳送。
    • 這種模式提供了比acks=0更高的可靠性,因為它確保了至少有一個Broker(即Leader)已經接收並持久化了訊息。但是,如果Leader在確認訊息之後但在其他副本同步之前崩潰,那麼這條訊息仍然可能會丟失(儘管這種情況下的資料丟失機率較低,丟失的風險場景)。
  3. acks=all(或acks=-1):
    • 在這種模式下,生產者會等待Kafka叢集中的所有同步副本(包括Leader和所有ISR副本)都確認訊息已經被成功寫入日誌後,才認為這條訊息已經被成功傳送。ISR(In-Sync Replicas)是指那些與Leader保持同步的副本。
    • 這種模式提供了最高的訊息持久化保證,因為它確保了訊息已經被寫入到多個副本中。但是,由於需要等待所有同步副本的確認,這種模式可能會引入更高的延遲,並降低吞吐量。

選擇合適的acks策略取決於你的業務需求和效能要求。如果你需要最高的吞吐量和最低的延遲,並且可以接受一定的訊息丟失風險,那麼acks=0可能是一個合適的選擇。如果你需要更高的可靠性,但可以接受一定的延遲,那麼acks=1可能是一個更好的選擇。如果你需要最高的訊息持久化保證,即使以犧牲一些吞吐量和延遲為代價,那麼acks=all將是你的最佳選擇。

相關文章