保存在Zookeeper或Kafka中的偏移量?
我对使用Kafka和Zookeeper时偏移的存储位置感到困惑。 看起来在某些情况下补偿存储在Zookeeper中,在其他情况下它们存储在Kafka中。
什么决定偏移量是存储在卡夫卡还是在Zookeeper中? 什么是利弊?
注意:当然,我也可以在一些不同的数据存储中存储偏移量,但这不是本文的图片的一部分。
关于我的设置的更多细节:
- 我运行这些版本:KAFKA_VERSION =“0.10.1.0”,SCALA_VERSION =“2.11”
- 我使用我的NodeJS应用程序中的kafka-node连接到Kafka / Zookeeper。
早期版本的Kafka(0.9之前版本)只在ZK中存储偏移量,而较新版本的Kafka默认在一个名为__consumer_offsets
的内部Kafka主题中存储偏移量(虽然新版本仍然可以提交给ZK)。
向经纪商提供补偿的好处是,消费者不依赖于ZK,因此客户只需要与简化整体架构的经纪人交谈即可。 另外,对于有大量消费者的大型部署,ZK可能成为瓶颈,而Kafka可以轻松处理这个负载(提交补偿与撰写主题相同,Kafka在这里可以很好地扩展 – 事实上,默认情况下, __consumer_offsets
是用50个分区IIRC创build)。
我不熟悉NodeJS或kafka节点 – 它取决于客户端实现如何提交抵消。
长话短说:如果你使用经纪人0.10.1.0
你可以提交抵消主题__consumer_offsets
。 但是这取决于你的客户端,如果它实现了这个协议。
更详细地说,这取决于您的经纪人和客户端版本(以及您使用的是哪种客户端API),因为较早的客户端可以与较新的经纪人进行交stream。 首先,您需要有经纪人和客户端0.9
或更高版本,才能将偏移量写入卡夫卡主题。 但是如果一个较老的客户端连接到0.9
代理,它仍然会向ZK提交抵消。
对于Java消费者:
这取决于消费者使用的是什么:0.9之前有两个“老消费者”即“高层次消费者”和“低层次消费者”。 两者都直接向ZK提交抵消。 自0.9
以来,两个消费者都被合并为单一消费者,被称为“新消费者”(它基本上统一了两个老消费者的低层次和高层次的API–这意味着在0.9
有三种types的消费者)。 新消费者承诺抵消经纪人(即内部的卡夫卡话题)
为了使升级更容易,还可以使用旧消费者“双重提交”抵消(从0.9
)。 如果通过dual.commit.enabled
启用此dual.commit.enabled
,偏移量将被提交给ZK和__consumer_offsets
主题。 这允许您从旧客户API切换到新的客户API,同时将您从ZK的偏移移至__consumer_offsets
主题。
这一切都取决于你正在使用的消费者。 您应该根据您的Kafka版本select合适的消费者。
对于版本0.8
经纪人使用HighLevelConsumer
。 你的组的偏移量存储在zookeeper中。
对于经纪商0.9
和更高,您应该使用新的ConsumerGroup
。 补偿存储与卡夫卡经纪人。
请记住, HighLevelConsumer
仍然可以使用0.8以上的版本,但是0.10.1
版本已经被弃用,支持很快就会消失。 ConsumerGroup
具有滚动迁移选项,以帮助您从HighLevelConsumer
迁移,如果您承诺使用它。