保存在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迁移,如果您承诺使用它。