Kafka 生产者在发送消息时,可能会出现消息重复发送的问题,主要有两种情况:
- 生产者实例重启导致已发送但未收到回执的消息再次发送。
- 生产者实例宕机期间 Kafka 自动将未提交的消息分配给其他生产者实例发送,导致消息被重复发送。
为解决消息重复发送问题,Kafka 提供了消息幂等性保证机制。主要通过两种方式实现:
- 消息去重(Message Deduplication):通过为每条消息设置一个唯一的消息键(Message Key),Broker 会对具有相同消息键的消息进行检查,避免重复发送。
- 生产者 ID(Producer ID):通过为每个生产者实例指定一个生产者 ID,然后结合序列化器(Serializer)和分区器(Partitioner)为每条消息生成一个唯一的序号。Broker 会对具有相同生产者 ID 和序列号的消息进行检查,避免重复发送。
例如:
生产者实例 P1 发送消息 M1,M2,M3,但在提交 M3 前宕机。
Kafka 将未提交的 M3 消息分配给生产者 P2 发送。
P1 重启后,也会发送 M3 消息。
如果启用消息去重,通过 M3 消息的唯一键,Kafka 会判断这是重复消息并丢弃 P1 发送的 M3。
如果启用生产者 ID,通过 P1 的生产者 ID 和 M3 消息序列号,Kafka 会判断这是重复消息并丢弃 P1 发送的 M3。
所以,通过消息去重或生产者 ID 机制,Kafka 可以很好地解决消息重复发送问题,保证消息的幂等性。
理解 Kafka 生产者消息幂等性保证机制,是使用 Kafka 避免数据重复发送的基础。