childe / healer

golang lib for kafka
22 stars 18 forks source link

rebalance时间过长 #4

Closed childe closed 5 years ago

childe commented 5 years ago

来自 https://github.com/childe/healer/issues/2

我咨询个问题,我发现rebalance的时间比sarama客户端长

比如,我有30个消费者 消费120个分区的大topic,稳定运行后,我并行重启这30个消费进程,发现 
ebalance的时间甚至到十几分钟或者半个小时,这方面可以优化吗?
childe commented 5 years ago

https://github.com/Shopify/sarama/pull/1083/files#diff-9076b00c0e67e4484d0c04fb247353c7R138

我先看了sarama 的 join group 的代码, 几乎一样的逻辑, 就是发送 join request , 然后发送 sync request. 如果失败就重试.

我会继续找一台压力大的kafka实测一下.

sundy-li commented 5 years ago

我没仔细看 kafka的协议,我猜测 rebalance的过程 可能是消费者并发重启的个数相关。

30个消费者 消费120个分区的大topic, 30个消费进程并发重启,每个消费进程都会去发送join请求,rebalance是会相互影响的。

可以发下你实现的healer参考 的kakfa的rebalance相关文档吗, 我也看看能不能做一些优化?

childe commented 5 years ago

https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-GroupMembershipAPI

childe commented 5 years ago

timeout设置有BUG, join的timeout应该比session timeout时间长, 默认是长5秒, 但代码有BUG, 导致没有生效. 所以很可能join的时候会timeout.

childe commented 5 years ago

@sundy-li 发现有逻辑上的错误, 在有两个consumer的时候, 会导致不停rebalance. d1b1891dfce530eaaa93dba388b67313c2e700d9 这个 commit 避免了这个问题, 但还不是完美的解决方法. 我找时间写一下这个问题的生产原因, 以及当前为啥可以避免.

sundy-li commented 5 years ago

@childe 我们遇到过这个坑。。 导致一直消费不起来,重启数次解决了