我可以限制kafka节点消费者的消费吗?

时间:2016-07-23 20:59:15

标签: node.js apache-kafka

好像我的kafka节点消费者:

var kafka = require('kafka-node');
var consumer = new Consumer(client, [], {
     ...
    });
在某些情况下,

提取的消息太多了。 有没有办法限制它(例如,每秒接受不超过1000条消息,可能使用暂停api?)

  • 我使用的是kafka-node,与Java版本相比似乎有一个有限的api

5 个答案:

答案 0 :(得分:5)

我有类似的情况,我正在消费来自Kafka的消息,并且不得不限制消费,因为我的消费者服务依赖于有自己约束的第三方API。

我使用async/queue以及名为async/cargo的{​​{1}}包装器进行批处理。 货物从kafka-consumer获取所有消息,并在达到大小限制asyncTimedCargo或超时batch_config.batch_size时将其发送到队列。 batch_config.batch_timeout提供async/queuesaturated回调,如果您的队列任务工作人员忙,您可以使用这些回调来停止消费。这将阻止货物填满,您的应用程序不会耗尽内存。消费将在不满足时恢复。

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

  1. 创建一个带有消息处理器的async.queue和一个并发(消息处理器本身包含setImmediate函数,因此它不会冻结事件循环)
  2. queue.drain设置为resume()消费者
  3. 将消费者的消息事件处理程序发送给消费者pause()并将消息推送到队列。

答案 4 :(得分:0)

我遇到了同样的问题,最初的 fetchMaxBytes 值是

fetchMaxBytes: 1024 * 1024 * 10 // 10MB

我只是把它改成

fetchMaxBytes: 1024

更改后运行非常顺利。