大佬教程收集整理的这篇文章主要介绍了Kafka丢数据、重复消费、顺序消费的问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
面试官:今天我想问下c;你觉得Kafka会丢数据吗?
候选者:嗯c;使用Kafka时c;有可能会有以下场景会丢消息
候选者:比如说c;我们用Producer发消息至Broker的时候c;就有可能会丢消息
候选者:如果你不想丢消息c;那在发送消息的时候c;需要选择带有 callBACk的api进行发送
候选者:其实就意味着c;如果你发送成功了c;会回调告诉你已经发送成功了。如果失败了c;那收到回调之后自己在业务上做重试就好了。
候选者:等到把消息发送到Broker以后c;也有可能丢消息
候选者:一般我们的线上环境都是集群环境下嘛c;但可能你发送的消息后broker就挂了c;这时挂掉的broker还没来得及把数据同步给别的brokerc;@R_772_11247@自然就丢了
候选者:发送到Broker之后c;也不能保证@R_772_11247@一定不丢了c;毕竟Broker会把数据存储到磁盘之前c;走的是操作系统缓存
候选者:也就是异步刷盘这个过程还有可能导致数据会丢
候选者:嗯c;到这里其实我已经说了三个场景了c;分别是:producer -> broker c;broker->broker之间同步c;以及broker->磁盘
候选者:要解决上面所讲的问题也比较简单c;这块也没什么好说的…
候选者:不想丢数据c;那就使用带有callBACk的apic;设置 acks、retries、factor等等些参数来保证Producer发送的消息不会丢就好啦。
面试官:嗯…
候选者:一般来说c;还是client 消费 broker 丢消息的场景比较多
面试官:那你们在消费数据的时候是怎么保证数据的可靠性的呢?
候选者:首先c;要想client端消费数据不能丢c;肯定是不能使用autoCommit的c;所以必须是手动提交的。
候选者:我们这边是这样实现的:
候选者:一、从Kafka拉取消息(一次批量拉取500条c;这里主要看配置)时
候选者:二、为每条拉取的消息分配一个msgId(递增)
候选者:三、将msgId存入内存队列(sortSet)中
候选者:四、使用Map存储msgId与msg(有offset相关的信息)的映射关系
候选者:五、当业务处理完消息后c;ack时c;获取当前处理的消息msgIdc;然后从sortSet删除该msgId(此时代表已经处理过了)
候选者:六、接着与sortSet队列的首部第一个Id比较(其实就是最小的msgId)c;如果当前msgId<=sort Set第一个IDc;则提交当前offset
候选者:七、系统即便挂了c;在下次重启时就会从sortSet队首的消息开始拉取c;实现至少处理一次语义
候选者:八、会有少量的消息重复c;但只要下游做好幂等就OK了。
面试官:嗯c;你也提到了幂等c;你们这业务怎么实现幂等性的呢?
候选者:嗯c;还是以处理订单消息为例好了。
候选者:幂等Key我们由订单编号+订单状态所组成(一笔订单的状态只会处理一次)
候选者:在处理之前c;我们首先会去查redis是否存在该Keyc;如果存在c;则说明我们已经处理过了c;直接丢掉
候选者:如果redis没处理过c;则继续往下处理c;最终的逻辑是将处理过的数据插入到业务DB上c;再到最后把幂等Key插入到redis上
候选者:所以c;redis其实只是一个「前置」处理c;最终的幂等性是依赖数据库的唯一Key来保证的(唯一Key实际上也是订单编号+状态)
候选者:总的来说c;就是通过redis做前置处理c;DB唯一索引做最终保证来实现幂等性的
面试官:你们那边遇到过顺序消费的问题吗?
候选者:订单的状态比如有 支付、确认收货、完成等等c;而订单下还有计费、退款的消息报
候选者:理论上来说c;支付的消息报肯定要比退款消息报先到嘛c;但程序处理的过程中可不一定的嘛
候选者:所以在这边也是有消费顺序的问题
候选者:但在广告场景下不是「强顺序」的c;只要保证最终一致性就好了。
候选者:所以我们这边处理「乱序」消息的实现是这样的:
候选者:一、宽表:将每一个订单状态c;单独分出一个或多个独立的字段。消息来时只更新对应的字段就好c;消息只会存在短暂的状态不一致问题c;但是状态最终是一致的
候选者:二、消息补偿机制:另一个进行消费相同topic的数据c;消息落盘c;延迟处理。将消息与DB进行对比c;如果发现数据不一致c;再重新发送消息至主进程处理
候选者:还有部分场景c;可能我们只需要把相同userId/orderId发送到相同的partition(因为一个partition由一个Consumer消费)c;又能解决大部分消费顺序的问题了呢。
面试官:嗯…懂了
【对线面试官-移动端】系列 一周两篇持续更新中!
【对线面试官-电脑端】系列 一周两篇持续更新中!
原创不易!!求三连!!
以上是大佬教程为你收集整理的Kafka丢数据、重复消费、顺序消费的问题全部内容,希望文章能够帮你解决Kafka丢数据、重复消费、顺序消费的问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。