Kafka 消费者可能会出现数据重复消费的问题,主要有两种情况:
- 消费者实例重启导致上次消费进度丢失,从旧的位置重新消费。
- 消费者实例曾发生过宕机,Kafka 为保证消息委派(Message Commitment)将消息重新分配给其他消费者实例,而之前的消费者实例重启后也会消费这些消息。
为解决数据重复消费问题,Kafka 提供了 offset 管理机制,消费者可以通过记录消费 progress 防止重复消费。主要有两种方式:
- 手动提交 offset:消费者手动调用 commitSync() 方法提交 offset。如果发生重复消费,从最后提交的 offset 开始消费。
- 自动提交 offset:通过设置 enable.auto.commit 为 true,让 Kafka 自动定期提交消费者的 offset。如果发生重复消费,从最后提交的 offset 开始消费。
例如,有两个消费者 C1 和 C2 同属一个消费者组,订阅同一个 Topic。
- C1 消费了 offset 0-3 的消息并提交 offset。此时 C1 实例宕机。
- C2 消费了 offset 0-5 的消息并提交 offset。
- C1 实例重启,由于其最后提交的 offset 为 3,所以会从 offset 4 开始重新消费,避免重复消费 0-3 的消息。
无论是手动提交 offset 还是自动提交 offset, offset 管理机制通过记录消费进度可以很好解决消息重复消费问题。
理解 Kafka 消费者 offset 管理机制,是使用 Kafka 避免数据重复消费的基础。