具有多个分区的使用者不会交错使用

时间:2019-08-29 14:59:15

标签: apache-kafka project-reactor

我正在尝试运行https://projectreactor.io/docs/kafka/release/reference/#_sample_consumer中所示的简单示例。我看到了链接中描述的输出,但是如果这是预期的输出,我会感到困惑。具体来说,链接说

  

生产者示例发布的20条消息应显示在   安慰。如上面的输出所示,消息按顺序使用   对于每个分区,但是来自不同分区的消息可能是   交错。

链接中的输出似乎也是我得到的。但是,首先使用分区1中的所有内容,然后再使用分区0。我实际上期望的是来自分区0的一条消息,来自分区1的一对消息,然后来自分区0的一对消息等等,依此类推(尽管在分区内消息是按预期的)订购)。

在本地运行时,我也会得到相同的输出。这是我所缺少的吗?

2 个答案:

答案 0 :(得分:2)

您看到的只是少量消息的预期行为。使用方从多个分区进行使用时,消费方将进行交织,但仅包含大量消息。

发生的事情是卡夫卡的消费者“分批”工作。它们每隔一段时间轮询一次,如果一个分区中的10条左右消息足够小以适合一个轮询请求或“批处理”,那么使用者甚至可以在进入下一个分区之前简单地同时消耗所有消息。 。这就是为什么您看不到20条消息的这种交错效果的原因。

如果您以20K消息重试测试,您应该会更加清楚地看到交错行为。

答案 1 :(得分:1)

+1到@mjuarez的答案。只是想补充一点,如果您将消费者的kubectl减少为1(默认值为500),从而迫使它一次处理一条消息,那么您也可能能够重现交错的消息。

来自Kafka Reference

  

NAME:最大投票记录
  描述:一次调用poll()所返回的最大记录数。
  TYPE:int
  默认值:500
  有效值:[1,...]
  重要性:中等