如何保证消息重复消费?

文章讨论了Kafka中消息重复问题的解决方案,通过幂等性与事务的结合来确保单会话的幂等性,介绍涉及的角色(生产者、事务协调器、分区等),以及如何通过transactionId的hash定位事务协调器并描述了整个提交流程。

背景:

为什么会出现消息重复现象呢?

如果在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.               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值