消费者故障,出现活锁问题如何解决?

出现活锁的情况是它持续的发送心跳但是没有处理为了预防消费者在 

这种情况下一直持有分区我们使用 max.poll.interval.ms 活跃检测机制在此 

基础上如果你调用的 poll 的频率大于最大间隔则客户端将主动地离开组 

便其他消费者接管该分区发生这种情况时你会看到 offset 提交失败调用 

commitSync()引发的 CommitFailedException)。这是一种安全机制保障 

只有活动成员能够提交 offset。所以要留在组中你必须持续调用 poll。

消费者提供两个配置设置来控制 poll 循环

max.poll.interval.ms:增大 poll 的间隔可以为消费者提供更多的时间去处理返 

回的消息调用 poll(long)返回的消息通常返回的消息都是一批)。缺点是此值 

越大将会延迟组重新平衡

max.poll.records:此设置限制每次调用 poll 返回的消息数这样可以更容易的 

预测每次 poll 间隔要处理的最大值通过调整此值可以减少 poll 间隔减少重 

新平衡分组的 

对于消息处理时间不可预测地的情况这些选项是不够的处理这种情况的推荐 

方法是将消息处理移到另一个线程中让消费者继续调用 poll。 但是必须注意确 

保已提交的 offset 不超过实际位置另外你必须禁用自动提交并只有在线程 

完成处理后才为记录手动提交偏移量取决于你)。 还要注意你需要 pause  

停分区不会从 poll 接收到新消息让线程处理完之前返回的消息如果你的处 

理能力比拉取消息的慢那创建新线程将导致你机器内存溢出)。

posted @ 2020-11-29 13:47  咔啡  阅读(563)  评论(0编辑  收藏  举报