高负荷下的Kafka Balancing问题

时间:2019-03-21 12:32:53

标签: apache-kafka

使用kafka版本2.11-0.11.0.3发布10,000条消息(所有消息的总大小为10MB),将有2个使用者(具有相同的组ID)作为并行处理来使用该消息。 在消费时,两个消费者都消费了相同的消息。

以下错误/警告由kafka引发

  

WARN:该成员将退出组,因为消费者轮询超时   已过期。这意味着后续调用poll()之间的时间   比配置的max.poll.interval.ms长,通常   表示轮询循环花费太多时间进行处理   消息。您可以通过增加   max.poll.interval.ms或通过减小批次的最大大小   在poll()中返回了max.poll.records。

     

信息:由于组正在重新平衡,尝试心跳失败

     

INFO:发送请假组请求给协调员

     

WARN:偏移量的同步自动提交   {ingest-data-1 = OffsetAndMetadata {offset = 5506,leaderEpoch = null,   元数据=“''}}失败:由于该组具有   已经重新平衡,并将分区分配给另一个成员。这个   表示两次调用poll()之间的时间长于   配置的max.poll.interval.ms,通常意味着   轮询循环花费太多时间处理消息。您可以   通过增加max.poll.interval.ms或减少   带有max.poll.records的poll()中返回的最大批处理大小。

以下配置已提供给kafka

server.properties

max.poll.interval.ms=30000
group.initial.rebalance.delay.ms=0
group.max.session.timeout.ms=120000
group.min.session.timeout.ms=6000

consumer.properties

session.timeout.ms=30000 
request.timeout.ms=40000

解决多种消耗应该进行哪些更改?

1 个答案:

答案 0 :(得分:0)

您的消费者是否在同一组中?如果是,则如果消费者在未提交其已处理的某些消息的情况下离开/死亡/超时,则将有多个消耗。

如果所有使用者都使用了您的所有消息,则可能没有为他们设置相同的组ID。

更多信息:

好,您已经为所有消费者设置了相同的组ID。您处于集群/经纪人认为某个使用者死亡并因此将负载重新平衡到另一个使用者的情况。另一个将开始消耗最后一次提交的位置。

因此,可以说使用者C_A从分区P_1读取最多100个偏移量,然后对其进行处理,然后提交'100',然后读取最多200个偏移,然后对其进行处理,但由于代理认为C_A已死而无法提交。

代理将分区P_1重新分配给使用者C_B,它将从该组的最后一次提交(即100)开始读取,最多读取200,处理并提交200。

所以您的问题是如何避免消费者被视为死者(我认为它还没有死)?

答案已经在您问题的黄色警告消息中:您可以告诉消费者在一次轮询中消耗更少的消息(最大轮询记录),以减少两次向经纪人轮询的处理时间,并且/或者您可以增加max.poll.interval.ms,告诉经纪人等更长的时间,然后再将您的消费者视为死亡...