kafka消息消费总结

坑s

关于消费终止

  1. 对于消息流来说,由于其中的一个消息处理异常导致该条消息失败,同时无法继续消费后续消息流;
  2. kafkaliveLock的概念,如果消费端在sessionTimeout时间段内没有poll消息,kafka会认为其挂掉了,然后释放其持有的partition?然而其他消费端拿到patition后依然会消费失败?
  3. 消费失败的原因是什么?(逻辑问题还是非逻辑问题),如果是非逻辑问题那么肯定需要支持重试,如果是逻辑问题那么重试也没用;
  4. 消费失败后如果把该条消息存起来,然后略过该消息去消费后面的消息,那么可能会面临消费顺序的问题(可能有)以及手动补偿的问题;

关于重复消费

  1. 目前kafka-client的偏移量提交都是批量提交本次pollmaxPollRecord条消息;
  2. 不论是commitSynccommitAsync,都会存在从kafka拉取一批数据maxPollRecord,只消费成功了一部分数据,之后崩掉没commit的情况,然后下次又会重复消费上一次消费成功的消息;
  3. 要避免重复消费,可以考虑拉一批回来,消费时在同一事务(maxPollRecord不可太大,否则大事务);或者maxPollRecord=1,事务性的消费(提交偏移量需要在事务内);
  4. 或者避免不了重复消费,需要保证重复消费时的幂等性(记录消费成功的消息【最好有一个唯一主键,关于唯一主键的生成...】);

关于重复消费消费终止

  1. 如果消费终止,并且maxPollRecord>1,那么很大可能性就会存在重复消费的问题;
  2. 如果不消费终止,那么就需要有补偿机制,并且需要记下日志,方便后续的补偿;

关于消费场景的问题

  1. 对于消费顺序和消息依赖没有要求的消费端:
    • 对于消息丢失可以容忍的场景(后续查询时强制刷新),可以忽略该条消息;
    • 对于消息丢失无法容忍的场景,且不希望消息终止,那么需要吞掉消费时的异常,不过需要注意的是,这种情况需要记录消费成功的消息状态、记录消费失败的消息详情,同时针对消费失败的消息详情,需要有补偿措施;
  2. 对于消费顺序和消息依赖有要求的消费端:消息顺序分全局有序和分区有序,或者需要等待前面的消息消费完毕后才能消费后面的消息。这两类情况只能等待当前消息消费成功,如果消费异常了,那么需要等待其消费成功(对于非逻辑错误可以考虑重试,如果为逻辑错误那么只能等待修复该bug);

你可能感兴趣的:(kafka消息消费总结)