据我所知(这可能是错误的),在Kafka中有一个名为__consumer_offsets
的主题(有许多分区),它包含所有group_id的所有提交,以group id为键。
当一个组启动时,那么组协调器(??)需要阅读本主题到最后,以找到该组id的最新提交。
如果许多其他的组都在写提交,那么当它尝试读的时候,日志会增长--那么它如何决定何时停止阅读,并继续它找到的提交呢?
编辑
只是想解释一下为什么当前的答案并没有真正回答这个问题。这里的问题不是“如何在合理的时间内结束”,而是什么机制触发组协调器停止消耗。只有有限数量的分区,所以不能保证另一个组id不会提交到同一个分区,因此,在读取期间,__comsumer_offset主题可能变得更长。
我可以推测它可能会被做的方式,但这只是我如何解决这个问题的想法,这里没有参考Kafka实际上解决了这个问题
1.它可以设置一个超时,并读取N秒,假设__consumer_offsets永远不会变大,所以N总是足够长以到达结尾。当N秒关闭时,轮询完成了我们看到的任何内容。
1.这听起来很危险,因为如果另一个组ID提交了很多次,那么你可能会永远等待轮询超时。
1.它可以在开始阅读之前检查分区的高水位线(结束偏移量),然后读,直到它已经读到或超过该偏移量。然后,如果在读已经开始之后添加了更多的消息,那就没关系了(我们知道新消息不是来自这个组id,所以可以安全地忽略)。
1.也许代理(已经运行了很长时间)不断地从__consumer_offsets主题中消费,并构建一个最新提交的查找表,然后组协调器只是询问代理,而不是直接阅读主题。
1条答案
按热度按时间ff29svar1#
只有在收到
JoinGroup
网络请求时,才会提取提交的偏移量,然后是带有分区分配的SyncGroup
,该分区分配由协调器与TopicPartitions和偏移量数据一起分配。https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol的
在分配之后,它不会再被获取。(这意味着外部进程可能会在您的使用过程中提交偏移,并且在重新平衡之前不会影响组)
对偏移主题进行大分区的原因是组名的散列分布良好,因此不需要扫描整个主题,只需扫描一个与键的散列匹配的分区。对于任何组,偏移提交都不需要频繁,但任何标准使用者都可以轻松地每秒使用数千个事件。偏移只是数字的数组,Map到主题名和分区。因此网络上的有效负载并不大
相关问题
在Kafka中,消费者团体协调员和消费者团体领袖有何关联?