坑s
关于消费终止
- 对于消息流来说,由于其中的一个消息处理异常导致该条消息失败,同时无法继续消费后续消息流;
-
kafka
有liveLock
的概念,如果消费端在sessionTimeout
时间段内没有poll
消息,kafka
会认为其挂掉了,然后释放其持有的partition
?然而其他消费端拿到patition后依然会消费失败? - 消费失败的原因是什么?(逻辑问题还是非逻辑问题),
如果是非逻辑问题那么肯定需要支持重试
,如果是逻辑问题那么重试也没用; - 消费失败后如果把该条消息存起来,然后略过该消息去消费后面的消息,那么可能会面临消费顺序的问题(可能有)以及手动补偿的问题;
关于重复消费
- 目前
kafka-client
的偏移量提交都是批量提交本次poll
的maxPollRecord
条消息; - 不论是
commitSync
和commitAsync
,都会存在从kafka
拉取一批数据maxPollRecord
,只消费成功了一部分数据,之后崩掉没commit
的情况,然后下次又会重复消费上一次消费成功的消息; - 要避免重复消费,可以考虑拉一批回来,消费时在同一事务(
maxPollRecord
不可太大,否则大事务);或者maxPollRecord=1
,事务性的消费(提交偏移量需要在事务内); - 或者避免不了重复消费,需要保证重复消费时的幂等性(记录消费成功的消息【最好有一个唯一主键,关于唯一主键的生成...】);
关于重复消费
和消费终止
- 如果
消费终止
,并且maxPollRecord>1
,那么很大可能性就会存在重复消费
的问题; - 如果
不消费终止
,那么就需要有补偿机制,并且需要记下日志,方便后续的补偿;
关于消费场景
的问题
- 对于
消费顺序和消息依赖
没有要求的消费端:- 对于消息丢失可以容忍的场景(后续查询时强制刷新),可以忽略该条消息;
- 对于消息丢失无法容忍的场景,且不希望
消息终止
,那么需要吞掉消费时的异常,不过需要注意的是,这种情况需要记录消费成功的消息状态、记录消费失败的消息详情,同时针对消费失败的消息详情,需要有补偿措施;
- 对于
消费顺序和消息依赖
有要求的消费端:消息顺序分全局有序和分区有序,或者需要等待前面的消息消费完毕后才能消费后面的消息。这两类情况只能等待当前消息消费成功,如果消费异常了,那么需要等待其消费成功(对于非逻辑错误可以考虑重试,如果为逻辑错误那么只能等待修复该bug);
网友评论