我使用的是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个?
答案 0 :(得分:1)
这听起来像是时间问题。第一次调用poll()
时,很可能只有一条消息可用 - 该方法无法保证将获取多少消息。当您编写代码时,您不应该假设您将一次性收到X记录。 Kafka 0.10 max.poll.records
有一个消费者属性,出于测试目的,您可能希望设置为1,然后执行接收循环,直到您对所有100个进行了轮询。
答案 1 :(得分:0)
最有可能只是竞争条件 - 消费者坐在poll()
中,经纪人一到达即发送第一条消息。
请参阅kafka docs中的属性fetch.min.bytes
和fetch.max.wait.ms
。
fetch.min.bytes
默认为1。
编辑
您还可以在致电flush()
之前尝试KafkaTemplate
getRecords()
。
但是,你的测试不应该真正依赖于在一次获取中获取所有消息 - 太脆弱了。