如何减慢或设置Kafka流消费者的给定速度?

时间:2017-06-29 06:23:53

标签: performance queue apache-kafka apache-kafka-streams

我正在尝试控制KStream消耗的消息数量,而且我不是很成功。

我正在使用: max.poll.interval.ms=100max.poll.records=20 每秒获得200条消息。

但它似乎不太好,因为我发现在我的统计数据中每秒也有500条消息。

我还应该在流消费者方面设置什么?

3 个答案:

答案 0 :(得分:5)

  

我正在使用:max.poll.interval.ms = 100和max.poll.records = 20来获取   每秒200条消息。

max.poll.interval.ms和max.poll.records属性不能以这种方式工作。

max.poll.interval.ms 表示消费者必须在主题的每次消费者调查之间等待的最长时间间隔(以毫秒为单位)。

max.poll.records 表示消费者在每次消费者调查主题期间可以使用的最大记录数。

每次轮询之间的间隔不受上述两个属性的控制,而是由消费者确认获取的记录所花费的时间。

例如,假设主题X存在,其中包含1000条记录,并且消费者确认所提取记录所花费的时间是20毫秒。使用max.poll.interval.ms = 100和max.poll.records = 20,消费者将每20ms轮询Kafka主题,并且在每次轮询中,将获取最多20个记录。如果确认获取的记录所花费的时间大于max.poll.interval.ms,则轮询将被视为失败,并且该特定批次将再次从Kafka主题重新轮询。

答案 1 :(得分:2)

KafkaConsumer(也是KafkaStreams内部使用的那个读取记录尽可能快。

您提到的参数会对性能产生影响,但您无法控制实际数据速率。另请注意,max.poll.records仅配置有多少记录poll()返回,但它对客户端代理通信没有影响。 KafkaConsumer在与代理交谈时可以获取更多记录,然后只要记录在缓冲区中就返回poll()上的缓冲消息(即,对于这种情况,poll()是客户端只能确保您不会通过max.poll.interval.ms超时的运营商。因此,您可能对fetch.max.bytes更感兴趣,它确定从代理获取的字节大小。如果减少此参数,则消费者效率较低,因此吞吐量应降低。 (虽然不推荐)。

配置吞吐量的另一种方法是配额(https://kafka.apache.org/documentation/#design_quotas)它是一个代理端配置,允许您限制客户端可以读取和/或写入的数据量。

在Kafka Streams中做的最好的事情(以及使用简单的KafkaConsumer时)是手动限制对poll()的调用。对于Kafka Streams,您可以在任何UDF中添加Thread.sleep()。如果您不想将其搭载到现有的运算符中,您只需添加一个具有短暂状态的foreach()(即类成员变量)来跟踪吞吐量并计算您需要睡到多少相应地限制吞吐量。

答案 2 :(得分:1)

你可以在消费者方面使用类似akka-stream-kafka(又名reactive-kafka)的东西。 akka-streams具有很好的限制功能,在这里会派上用场:

http://doc.akka.io/docs/akka/snapshot/java/stream/stream-quickstart.html#time-based-processing

相关问题