好像我的kafka节点消费者:
var kafka = require('kafka-node');
var consumer = new Consumer(client, [], {
...
});
在某些情况下,提取的消息太多了。 有没有办法限制它(例如,每秒接受不超过1000条消息,可能使用暂停api?)
答案 0 :(得分:5)
我有类似的情况,我正在消费来自Kafka的消息,并且不得不限制消费,因为我的消费者服务依赖于有自己约束的第三方API。
我使用async/queue
以及名为async/cargo
的{{1}}包装器进行批处理。
货物从kafka-consumer获取所有消息,并在达到大小限制asyncTimedCargo
或超时batch_config.batch_size
时将其发送到队列。
batch_config.batch_timeout
提供async/queue
和saturated
回调,如果您的队列任务工作人员忙,您可以使用这些回调来停止消费。这将阻止货物填满,您的应用程序不会耗尽内存。消费将在不满足时恢复。
unsaturated
答案 1 :(得分:2)
在Kafka,民意调查和流程应以协调/同步的方式进行。即,在每次轮询之后,您应该在进行下一次轮询之前首先处理所有收到的数据。此模式将自动将消息数量限制为客户端可以处理的最大吞吐量。
像这样的东西(伪代码):
[[1]]
[[1]]$id
[1] "176248"
[[1]]$report_list_id
[[1]]$report_list_id[[1]]
[1] "183556"
[[1]]$name
[1] "Torchy's Tacos"
[[2]]
[[2]]$id
[1] "180642"
[[2]]$report_list_id
[[2]]$report_list_id[[1]]
[1] "188160"
[[2]]$name
[1] "CircusTrix"
(这就是为什么没有参数“fetch.max.messages” - 你只是不需要它。)
答案 2 :(得分:1)
据我所知,API没有任何限制。但是消费者(Consumer和HighLevelConsumer)都有'pause()'功能。因此,如果您收到很多消息,您可以停止消费。也许那已经提供了你所需要的。
请记住发生了什么。您向代理发送获取请求并获取一批消息。您可以配置要获取的消息的最小和最大大小(根据文档而不是消息数量):
{
....
// This is the minimum number of bytes of messages that must be available to give a response, default 1 byte
fetchMinBytes: 1,
// The maximum bytes to include in the message set for this partition. This helps bound the size of the response.
fetchMaxBytes: 1024 * 1024,
}
答案 3 :(得分:0)
来自自述文件中的FAQ
async.queue
和一个并发(消息处理器本身包含setImmediate
函数,因此它不会冻结事件循环)queue.drain
设置为resume()
消费者pause()
并将消息推送到队列。答案 4 :(得分:0)
我遇到了同样的问题,最初的 fetchMaxBytes 值是
fetchMaxBytes: 1024 * 1024 * 10 // 10MB
我只是把它改成
fetchMaxBytes: 1024
更改后运行非常顺利。