kafka消息丢失解决方案

kafka消息丢失解决方案

需求:最近项目中遇到的一个需求就是,从kafka读取了相关的消息,并且就是实时写到数据库中,但是因为是线上的环境连接数据库可能会由于网络的问题造成连接失败,所以必须要保证的就是一但数据库写失败了,对应的kafka消息我们是不能去消费的,否则就会造成消息的丢失,这样是不允许的

1.首先想到了事务解决方案,一但数据库失败回滚就可以了,相应消费的信息也就回滚了,但是后面发现这样是不行的,因为kafka的数据源和数据库mysql的数据源不是同一个数据源,相对来说是分开的,所以mysql回滚是解决不了kafka回滚的,这个方案pass掉

2.然后考虑到kafka消费的时候可以手动提交offset,那么每次我们可以先插入数据再提交offset,一旦插入数据失败的话我们不提交offset的话我们就会是默认不去消费的,等到下一次重启broker就可以继续消费未消费的消息,这种方案有一点不好的是就是一般线上情况是很少去重启broker的,还有就是如果存在一种情况就是因为网络问题就是数据库插入失败,当前消息没有去消费,但是后面网络问题回复数据库没问题,这个时候就会去提交新的offset了,那之前未提交的offset相当于是被覆盖了,因为kafka读取消息是默认从最新的offset读取的。还有一种情况也类似于,就是比如说你项目部署了台服务器,但是一台mysql失败不提交offset,另一台mysql成功提交offset,这样也会出现前面被覆盖的问题。这种也不建议

3.还有一种方案就是,可以利用Redis去将每次失败的的消息存起来,然后每天定时任务将其写到数据库,保证消息不丢失,或者就是手动实现消息重试(要用到redis比较麻烦),最后重试一定次数还不行的话就将消息发到一个死信队列,人工查看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值