如何避免Kafka的重复消费问题?

Kafka 消息的重复消费主要产生于:

  1. 消费者提交Offset失败后重复提交,导致重复消费同一消息。
  2. 消费者从Checkpoint重启后重复消费部分消息。
  3. 消费逻辑本身的幂等性问题导致消息被多次处理。

解决重复消费的主要方式有:

  1. 幂等性消费:消费逻辑本身对消息进行幂等处理,多次消费同一消息结果相同。
  2. 定期检查重发消息:消费者定期检查是否有重复消费的消息,如果有则跳过。
  3. 消费确认:消费者只在消费消息后发送确认给Broker,等待Broker确认后再提交Offset。
  4. 去重数据保存:将消费过的消息数据保存至外部存储,再消费前先查询外部存储检查是否重复。
  5. 消费者端重发检查:消费者启用检查点(Checkpoint),重启从Checkpoint开始消费,检查是否有重复消息。
  6. 记录消费历史:将消费过的消息数据保存至日志或数据库,重启消费前先加载消费历史检查重复消息。

例如,消费者逻辑使用去重表保存每消费一条消息的Key,再消费一条消息前先查询去重表,如果存在则跳过,否则正常消费并保存至去重表。这可以避免同一Key的消息被重复消费。

例如,消费者启用检查点,在消费到一定数量的消息后发送Offset至Broker,Broker将Offset保存至磁盘。消费者重启后从最新的检查点Offset开始消费,继续发送检查点Offset给Broker,这样可以避免重复消费部分消息。

例如,消费者消费消息后不直接提交Offset,而是发送确认给Broker,Broker在收到确认后提交Offset并确认给消费者。消费者收到Broker确认后再提交Offset。这样Broker可以根据两次确认之间的Offset判断是否有重复消息,如果有会通知消费者跳过。