极简单系列-kafka 生产-重复问题

极简单系列-kafka 生产-重复问题_第1张图片


极简单系列-kafka 生产-重复问题_第2张图片
重复的原因 acks = -1 的情况下,数据发送到 leader 后 ,部分 ISR 的副本同步,leader 此时挂掉。比如 follower1 和 follower2 都有可能变成新的 leader, producer 端会得到返回异常,producer 端会重新发送数据,数据可能会重复 另外, 在高阶消费者中,offset 采用自动提交的方式, 自动提交时,假设 1s 提交一次 offset 的更新,设当前 offset = 10,当消费者消费了 0.5s 的数据,offset 移动了 15,由于提交间隔为 1s,因此这一offset 的更新并不会被提交,这时候我们写的消费者挂掉,重启后,消费者会去 ZooKeeper 上获取读取位置,获取到的 offset 仍为10,它就会重复消费. 解决办法使用低级消费者.低级API 重复解决方案 消息用唯一id标示 生产者(ack=all 代表至少成功发送一次)|消费者(offset手动提交) 落表 or 业务逻辑处理(redis/mango)判断其是否已消费



在初始化期间,kafka会给生产者生成一个唯一的ID称为Producer ID或PID。 PID和序列号与消息捆绑在一起,然后发送给Broker。由于序列号从零开始并且单调递增,因此,仅当消息的序列号比该PID / TopicPartition对中最后提交的消息正好大1时,Broker才会接受该消息。如果不是这种情况,则Broker认定是生产者重新发送该消息。


但是它也有局限性

极简单系列-kafka 生产-重复问题_第3张图片
在初始化期间,kafka会给生产者生成一个唯一的ID称为Producer ID或PID。 PID和序列号与消息捆绑在一起,然后发送给Broker。由于序列号从零开始并且单调递增,因此,仅当消息的序列号比该PID / TopicPartition对中最后提交的消息正好大1时,Broker才会接受该消息。如果不是这种情况,则Broker认定是生产者重新发送该消息。


综上:

极简单系列-kafka 生产-重复问题_第4张图片

你可能感兴趣的:(极简单系列-kafka)