我正在使用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]
错误。
答案 0 :(得分:1)
我挖到了kafka-node源代码,并且我可以使用一个未记录的调用来获取分区信息:
client.loadMetadataForTopics(['test'], function(err, results) {..}
(我不喜欢称那些似乎不是公共API的文档部分的东西,我对返回结果的原始感觉混合数组性质感到不舒服,但它解决了我的问题目前。)