我对使用Kafka和Zookeeper时在哪里存储偏移量感到困惑。在某些情况下,偏移似乎存储在Zookeeper中,而在其他情况下,偏移存储在Kafka中。
是什么决定偏移量存储在Kafka还是Zookeeper中?优点和缺点是什么?
注意:当然,我也可以将偏移量单独存储在其他数据存储区中,但这并不是本文的内容。
有关我的设置的更多详细信息:
Kafka的较早版本(0.9之前的版本)仅将偏移量存储在ZK中,而默认情况下,较新版本的Kafka则将偏移量存储在内部Kafka主题中__consumer_offsets(尽管较新的版本可能仍适用于ZK)。
__consumer_offsets
向经纪人提供补偿的好处是,消费者不依赖ZK,因此客户只需要与经纪人对话,这简化了总体架构。另外,对于拥有大量用户的大型部署,ZK可能成为瓶颈,而Kafka可以轻松处理此负载(提交偏移量与编写主题是同一回事,并且Kafka在此处很好地扩展- 实际上,默认情况下__consumer_offsets会创建50个分区IIRC)。
我对NodeJS或kafka-node不熟悉-它取决于客户端实现如何提交偏移量。
长话短说:如果您使用经纪人0.10.1.0,则可以向topic提交补偿__consumer_offsets。但是,它是否实现此协议取决于您的客户端。
0.10.1.0
更详细地说,这取决于您的代理和客户端版本(以及您使用的是哪个消费者API),因为较旧的客户端可以与较新的代理通信。首先,您需要具有代理和客户端版本0.9或更高版本,才能将偏移量写入Kafka主题。但是,如果较旧的客户端连接到0.9代理,它将仍然向ZK提交补偿。
0.9
对于Java使用者:
这取决于用户使用什么:0.9之前有两个“老用户”,即“高级用户”和“低级用户”。两者都直接向ZK提交偏移量。从那时起0.9,这两个消费者合并为一个单一的消费者,称为“新消费者”(它基本上将两个老消费者的低级API和高级API统一了- 这意味着0.9存在三种类型的消费者)。新消费者对经纪人的承诺抵消(即内部的Kafka主题)
为了简化升级,还可以使用旧的使用者(自0.9)开始“双重提交”补偿。如果通过启用此功能dual.commit.enabled,则偏移量将提交给ZK和__consumer_offsets主题。这样,您就可以将偏移量从ZK转移到__consumer_offsets主题,同时从旧的使用者API切换到新的使用者API 。
dual.commit.enabled