Apache kafka 卡夫卡消费者第一次获得唱片时,从众多唱片中只获得一张?

Apache kafka 卡夫卡消费者第一次获得唱片时,从众多唱片中只获得一张?,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring Kafka,我正在使用SpringKafka和SpringKafka测试版本1.0.2.0 在我的一个测试中,我的应用程序使用KafkaTemplate和大部分默认配置设置,将一行100条记录发送到嵌入式Kafka实例上的单个TopicPartion 我使用KafkaTestUtils.getRecords(consumer)方法尝试从Kafka实例获取记录,并验证它们是否都已发送 第一次调用getRecords时,我只收到一条记录。如果我再打一次,我会得到另外99个 如果我显式地将使用者的位置设置为Top

我正在使用SpringKafka和SpringKafka测试版本1.0.2.0

在我的一个测试中,我的应用程序使用KafkaTemplate和大部分默认配置设置,将一行100条记录发送到嵌入式Kafka实例上的单个TopicPartion

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

第一次调用getRecords时,我只收到一条记录。如果我再打一次,我会得到另外99个

如果我显式地将使用者的位置设置为TopicPartition的开头,然后调用getRecords,那么我得到所有100个


为什么getRecords第一次只能得到一条记录?是否有更好的方法可以一次获得所有100条消息,然后显式地在消费者上调用seektobegining?

很可能只是一种竞争条件-消费者坐在
poll()
中,代理在收到第一条消息后立即发送第一条消息

请参阅中的属性
fetch.min.bytes
fetch.max.wait.ms

默认情况下,
fetch.min.bytes
为1

编辑

在调用
getRecords()
之前,您还可以尝试
flush()
调用
KafkaTemplate


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

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

如果刷新
KafkaTemplate
,然后在调用
getRecords()
之前等待5秒,也会发生同样的情况。增加
fetch.min.bytes的值会增加第一次调用
getRecords
返回的记录总数。我希望5秒钟的时间足够让消息全部到达代理。接下来的~80条消息都可用于紧接第一次呼叫之后的下一次
getRecords
呼叫。还有什么方法可以保证在消费者阅读之前所有的消息都在那里,或者消费者会阅读所有可用的消息吗?我有点惊讶
flush()
没有帮助,但正如我在上一次编辑中所说的那样-如果单靠计时,您的测试将变得脆弱,因此,一个足够大的
fetch.min.bytes
和一个大的
fetch.max.wait.ms
可能是获得可靠测试的唯一方法。它将使您的测试运行更长(除非您能够准确地计算出100条消息的字节数(有开销)是以字节为单位的),但它将是可靠的(直到kafka更改开销的大小:)。是的,我不想让这些等待留在那里。我只是想测试问题是否在于这些信息是否仍在飞往卡夫卡。似乎当消费者第一次被呼叫时,所有消息都应该已经存在。但是,第一次,使用者似乎只读取足够的消息来满足
fetch.min.bytes
值,然后在第二次调用时,它将读取尽可能多的其他消息,而不管大小。为什么第一个调用依赖于
fetch.min.bytes
值,而第二个不依赖?我不知道-这是卡夫卡人的问题。可能只是他们内部算法的工作方式。