一尘不染

存储在Zookeeper或Kafka中的偏移量?

node.js

我对使用Kafka和Zookeeper时在哪里存储偏移量感到困惑。在某些情况下,偏移似乎存储在Zookeeper中,而在其他情况下,偏移存储在Kafka中。

是什么决定偏移量存储在Kafka还是Zookeeper中?优点和缺点是什么?

注意:当然,我也可以将偏移量单独存储在其他数据存储区中,但这并不是本文的内容。

有关我的设置的更多详细信息:

  • 我运行以下版本:KAFKA_VERSION =“ 0.10.1.0”,SCALA_VERSION =“ 2.11”
  • 我使用NodeJS应用程序中的kafka-node连接到Kafka / Zookeeper。

阅读 970

收藏
2020-07-07

共1个答案

一尘不染

Kafka的较早版本(0.9之前的版本)仅将偏移量存储在ZK中,而默认情况下,较新版本的Kafka则将偏移量存储在内部Kafka主题中__consumer_offsets(尽管较新的版本可能仍适用于ZK)。

向经纪人提供补偿的好处是,消费者不依赖ZK,因此客户只需要与经纪人对话,这简化了总体架构。另外,对于拥有大量用户的大型部署,ZK可能成为瓶颈,而Kafka可以轻松处理此负载(提交偏移量与编写主题是同一回事,并且Kafka在此处很好地扩展-
实际上,默认情况下__consumer_offsets会创建50个分区IIRC)。

我对NodeJS或kafka-node不熟悉-它取决于客户端实现如何提交偏移量。

长话短说:如果您使用经纪人0.10.1.0,则可以向topic提交补偿__consumer_offsets。但是,它是否实现此协议取决于您的客户端。

更详细地说,这取决于您的代理和客户端版本(以及您使用的是哪个消费者API),因为较旧的客户端可以与较新的代理通信。首先,您需要具有代理和客户端版本0.9或更高版本,才能将偏移量写入Kafka主题。但是,如果较旧的客户端连接到0.9代理,它将仍然向ZK提交补偿。

对于Java使用者:

这取决于用户使用什么:0.9之前有两个“老用户”,即“高级用户”和“低级用户”。两者都直接向ZK提交偏移量。从那时起0.9,这两个消费者合并为一个单一的消费者,称为“新消费者”(它基本上将两个老消费者的低级API和高级API统一了-
这意味着0.9存在三种类型的消费者)。新消费者对经纪人的承诺抵消(即内部的Kafka主题)

为了简化升级,还可以使用旧的使用者(自0.9)开始“双重提交”补偿。如果通过启用此功能dual.commit.enabled,则偏移量将提交给ZK和__consumer_offsets主题。这样,您就可以将偏移量从ZK转移到__consumer_offsets主题,同时从旧的使用者API切换到新的使用者API

2020-07-07