Kafka HLC应该如何计算某个主题的分区数量?

时间:2015-06-10 22:08:15

标签: node.js apache-kafka

我正在使用kafka-node HighLevelConsumer,遇到问题,我总是在启动时收到重复的邮件。

为了维护处理顺序,我的消费者只是将消息附加到工作队列,然后我按顺序处理事件。如果我在队列中出现高水位标记,我会暂停消费者,我已禁用自动提交,并在客户端代码完全处理每个事件后“手动”提交。

尽管提交,但在启动时,我总是从一个或多个分区获取最后一个(先前提交的)消息(取决于我的组中正在运行的其他HLC数量)。我有点惊讶HLC不会给我(提交+ 1)但我决定只“忽略”比提交的偏移更早的偏移的消息。作为快速测试,

offset.fetchCommits('fnord', [{topic:'test', partition: 0}, 
                              {topic:'test', partition: 1}, 
                              {topic:'test', partition: 2}, 
                              {topic:'test', partition: 3}], ...

如果我的有效负载列表与定义的分区数匹配,则此方法有效。如果我超过分区数,我会收到[BrokerNotAvailableError: Could not find the leader]错误。

  1. 我是否正确无法自动提交,如果我想要更强大的保证,如果我的消息处理是异步的并且可能会失败(即ETL作业),我将不会丢失消息? kafka-node只发出'消息'事件,无法确认它是否已成功处理。
  2. HighLevelConsumer是否会读取上次提交的偏移(即重复)的消息而不是 next 偏移量的预期行为?
  3. 获取主题分区数量的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我挖到了kafka-node源代码,并且我可以使用一个未记录的调用来获取分区信息:

client.loadMetadataForTopics(['test'], function(err, results) {..}

(我不喜欢称那些似乎不是公共API的文档部分的东西,我对返回结果的原始感觉混合数组性质感到不舒服,但它解决了我的问题目前。)