在卡夫卡消费者第一次获得记录时,许多人只获得了一个记录?

时间:2016-08-11 17:10:49

标签: apache-kafka kafka-consumer-api spring-kafka

我使用的是spring-kafka和spring-kafka-test版本1.0.2.RELEASE。

在我的一个测试中,我的应用程序使用KafkaTemplate和大多数默认配置设置连续向EmbeddedKafka实例上的单个TopicPartion发送100条记录。

我使用KafkaTestUtils.getRecords(consumer)方法尝试从Kafka实例获取记录并验证它们是否已全部发送。

我第一次拨打getRecords时,我只收到一条记录。如果我再次打电话,我会得到另一个99。

如果我明确地将消费者的位置设置为TopicPartition的开头,然后调用getRecords,我将获得全部100个。

为什么getRecords第一次只能获得一条记录?是否有更好的方法可以通过在消费者上明确调用seekToBeginning来同时获得所有100个?

2 个答案:

答案 0 :(得分:1)

这听起来像是时间问题。第一次调用poll()时,很可能只有一条消息可用 - 该方法无法保证将获取多少消息。当您编写代码时,您不应该假设您将一次性收到X记录。 Kafka 0.10 max.poll.records有一个消费者属性,出于测试目的,您可能希望设置为1,然后执行接收循环,直到您对所有100个进行了轮询。

答案 1 :(得分:0)

最有可能只是竞争条件 - 消费者坐在poll()中,经纪人一到达即发送第一条消息。

请参阅kafka docs中的属性fetch.min.bytesfetch.max.wait.ms

fetch.min.bytes默认为1。

编辑

您还可以在致电flush()之前尝试KafkaTemplate getRecords()

但是,你的测试不应该真正依赖于在一次获取中获取所有消息 - 太脆弱了。