就在今天早上發現推送連續推了幾條重複的消息,於是就仔細地查閱了下kafka相關配置,大概如下:
kafka:
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
batch-size: 1000
buffer-memory: 524288
retries: 0
acks: -1
consumer:
# group-id: consumer-tutorial-${server.port}
group-id: consumer-tutorial
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
auto-offset-reset: earliest
enable-auto-commit: true
消費使用地是默認值,自動提交,間隔時間也沒有設置(其實之前別人設置了,auto-commit-interval-ms,但這個屬性在SpringBoot配置中並不存在,而是auto-commit-interval。也就是說之前設置的都是錯誤的,沒有起作用)。我在本地做測試也沒發現問題,沒辦法就分析了下日誌,發現消費端從接收到業務處理完花了好幾分鐘(說到這裏,我原先以爲kafka自動提交點是在消費端一接收到消息時就提交,但是並不是這樣的)。於是,我就試着在本地做延時操作,分別試了延遲2分鐘、3分鐘、5分鐘。當我延時了5分鐘的時候,就出現消費端重複消費的問題。那麼問題就很明顯了,就是因爲消費端不是在一收到消息就提交,而是在整個業務完成之後才提交的。
另外,說一下,我使用的時Spring提供的@KafkaListener來監聽。