Apache Kafka-AckMode最佳实践
文章目錄
- 概述
- AckMode源碼解讀
- 自動提交設置
- 手工提交設置
- 最佳實踐
概述
Apache Kafka-消息丟失分析 及 ACK機制探究
我們這里配了個manual, 為啥子嘛
AckMode源碼解讀
我們來看下 Spring Kafka封裝的ACK
ContainerProperties#AckMode
/*** The offset commit behavior enumeration.*/public enum AckMode {/*** Commit after each record is processed by the listener.*/RECORD,/*** Commit whatever has already been processed before the next poll.*/BATCH,/*** Commit pending updates after* {@link ContainerProperties#setAckTime(long) ackTime} has elapsed.*/TIME,/*** Commit pending updates after* {@link ContainerProperties#setAckCount(int) ackCount} has been* exceeded.*/COUNT,/*** Commit pending updates after* {@link ContainerProperties#setAckCount(int) ackCount} has been* exceeded or after {@link ContainerProperties#setAckTime(long)* ackTime} has elapsed.*/COUNT_TIME,/*** User takes responsibility for acks using an* {@link AcknowledgingMessageListener}.*/MANUAL,/*** User takes responsibility for acks using an* {@link AcknowledgingMessageListener}. The consumer* immediately processes the commit.*/MANUAL_IMMEDIATE,}自動提交設置
- RECORD
每條消息被消費完成后,自動提交
- BATCH
每一次消息被消費完成后,在下次拉取消息之前,自動提交 (默認模式)
- TIME :
達到一定時間間隔后,自動提交, 并不是一到就立馬提交,如果此時正在消費某一條消息,需要等這條消息被消費完成,才能提交消費進度
- COUNT
消費成功的消息數到達一定數量后,自動提交 ,它并不是一到就立馬提交,如果此時正在消費某一條消息,需要等這條消息被消費完成,才能提交消費進度
- COUNT_TIME
TIME 和 COUNT 的結合體,滿足任一都會自動提交。
手工提交設置
- MANUAL
調用時,先標記提交消費進度。等到當前消息被消費完成,然后在提交消費進度。
- MANUAL_IMMEDIATE
調用時,立即提交消費進度。
最佳實踐
那應該怎么配置呢
-
配置 spring.kafka.consumer.enable-auto-commit為true, spring.kafka.consumer.auto-commit-interval 設置自動提交的頻率 , 舉個例子 自動提交,批量拉去了一波,還沒消費完,你就提交了,這給時候如果消費者掛了,消息丟失。。。
-
配置 spring.kafka.consumer.enable-auto-commit為false , spring.kafka.listener.ack-mode 設置具體模式,結合具體情況。 有可能重復消費,注意冪等性的判斷
-
另外,spring.kafka.listener.ack-time 和 spring.kafka.listener.ack-count 可以設置自動提交的時間間隔和消息條數
總而言之,沒有標準答案,需要進行trade off ,權衡一下
嗨 ,你這不是誒說么。。。。
總結
以上是生活随笔為你收集整理的Apache Kafka-AckMode最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache Kafka-消费端_顺序消
- 下一篇: 深入理解分布式技术 - 消息队列使用场景