在处理Kafka Streams应用程序时,我们观察到组协调代理在__consumer_offsets
主题中存储重新平衡元数据。
因为在我们的例子中我们有1200个流线程,这个元数据变得很大(大约100 MB没有压缩,LZ4压缩后25 MB),并且由于offsets.load.buffer.size
参数的默认值只有5MB,因此相应的__consumer_offsets
主题分区的关注者代理无法阅读。这导致新GroupCoordinator在旧GroupCoordinator出现故障时使用error_code=16 (NotCoordinatorException)
进行响应。
为什么经纪人在__consumer_offsets
主题中存储消费者组的重新平衡元数据,有没有办法禁用它?
存储组元数据是出于故障转移的原因。如果GroupCoordinator死亡而另一个代理接管这些组,则需要此数据才能正常工作。这是消费者/经纪人功能,并非特定于Kafka Streams。
例如,新的GroupCoordinator必须知道组中的成员应用相应的超时(即session.timeout
和max.poll.timeout
)。
因此,无法禁用它,因为群集正常工作至关重要。您可以更改相应的配置设置,以便为代理提供足够大的内存限制来处理组元数据。
对于普通的KafkaConsumers
组,元数据通常不会快速增长,并且处理大型组通常不是问题。但是,与客户端相比,KafkaStreams
添加了额外的元数据,其元数据特别大。这是一个已知问题,我相信将来会解决这个问题。