背景:
为什么会出现消息重复现象呢?
如果在ack=-1的情况下,等到leader+follower都落盘完成之后,刚好要ack,此时leader挂了,那这种情况下,生产者需要重新发送数据,此时就会重新消费消息,但是这种情况下,我们引入了幂等性,主键为<PID,Partition,SeqNumber>,其中PID为每次kafka重启都会分配,Partition分区数,这意味着kafka只能保证单会话幂等性,并不能保证完全幂等,这个时候就要引入事务。
所以这里是使用幂等性+事务的方式,我当时在考虑这两者是怎么结合起来的,这个很关键?
使用幂等性的缺陷是如果kafka宕机,消息仍然可能重复发送,那为了保证重启后,仍然处理未完成的事务,这里就引入了事务。
首先讲一下涉及到的角色:
1、生产者
2、事务协调器
3、分区
4、存储事务信息的特殊主题
在broker中,对于每一个broker都有一个事务协调器,那producer怎么知道定位到哪一个broker的tc,这个时候的解决办法就是hash法,对于每一个producer都有一个transactionId,transactionId的hashcode值除以50(默认50个分区) 。
最后讲一下整个流程:
producer向broker要pid,拿到pid之后就要向Leader分区发送消息,然后commit请求,tc就会向存储事务信息的特殊主题,保存此次提交的请求信息,然后返回生产者成功信息。tc又向Partition发送确认请求,确认消息是否落盘成功,返回成功后,tc就会将commit成功的消息发送给了存储事务信息的partition.
文章讨论了Kafka中消息重复问题的解决方案,通过幂等性与事务的结合来确保单会话的幂等性,介绍涉及的角色(生产者、事务协调器、分区等),以及如何通过transactionId的hash定位事务协调器并描述了整个提交流程。
1345

被折叠的 条评论
为什么被折叠?



