作者回复: 嗯嗯,确实是。只是目前Kafka要求所有consumer都发送SyncGroup请求给Coordinator,因为分配方案只能通过SyncGroupResponse的方式获取。图中只是想表示这是一种机制,没有太区分consumer leader和其他consumer
作者回复: 只是想表明这是统一的一种机制。。。源代码中肯定没有这样的话。。。
作者回复: 每次consumer发送心跳时会顺带发送session timeout时间,这样Coordinator收到后会根据这个session timeout时间计算下次deadline时间,如果过了deadline还没有收到直接fail掉该consumer
作者回复: 嗯嗯,非常赞的思路。现在社区正在对rebalance进行改革中有很多思想和你也有重合之处。
作者回复: 客户端自己确定分配方案有很多好处。比如可以独立演进和上线,不依赖于服务器端
作者回复: 1. 可以配置offsets.retention.minutes
2. 新版本consumer的一个改进就是把分区分配策略从server端移到consumer端来做。Client端代码演进的速度和容易程度要远胜于服务器端,算是一个优势吧
作者回复: 我可不敢误人子弟:) 看看R大推荐的书单吧:https://www.douban.com/doulist/2545443/
作者回复: 感谢纠正,已修改~~
作者回复: 这只是其中的一个可能的原因。client端代码更新的难度要远小于broker端。如果是broker代码更新,你需要rolling upgrade所有集群中的broker,在生产环境中并不一定有这样的时间窗口
作者回复: 不会造成数据丢失,但可能造成数据重复消费。
作者回复: 显示-是因为消费者有成员没有启动的缘故。另外每次consumer-id不同的确表明每次都是新的member
作者回复: 没有具体的限制。反正如果consumer提交的位移请求到broker端时整个group已经从Preparing进化到Completing了,那么就晚了,broker会拒绝这个提交请求
作者回复: 至少这样能统一机制,因为目前非leader consumer依赖SyncGroup请求才能获取分配方案
作者回复: 短时间内我不确定这个方案是否可行,大体上看是一个很好的想法。如果可以细化的话,不妨提一个KIP:)
作者回复: join group时也是有一个总的超时时间的(取所有member最大的rebalance超时时间),靠这个作为判断是否进入到下一阶段的阈值。
作者回复: commit失败先看看是不是消息处理慢导致的吧。比如增加max.poll.interval.ms的值或降低max.poll.records的值试试看。Client端报出Coordinator不可用不一定表示Coordinator真的不可用
作者回复: 是的,不是empty就不删除
作者回复: 分区数变化是指topic增加了分区