消费者故障,出现活锁问题如何解决?
Posted 四猿外
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消费者故障,出现活锁问题如何解决?相关的知识,希望对你有一定的参考价值。
出现“活锁” 的情况,是它持续的发送心跳, 但是没有处理。为了预防消费者在这种情况下一直持有分区,我们使用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 接收到新消息,让线程处理完之前返回的消息(如果你的处理能力比拉取消息的慢,那创建新线程将导致你机器内存溢出) 。
以上是关于消费者故障,出现活锁问题如何解决?的主要内容,如果未能解决你的问题,请参考以下文章