Apache kafka 卡夫卡消费者调查行为

Apache kafka 卡夫卡消费者调查行为,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,关于KafkaConsumer(>=0.9),我在尝试为自己的需求实施解决方案时遇到了一些严重的问题 让我们想象一下,我有一个函数,只能读取卡夫卡主题中的n消息 例如:getMsgs(5)-->获取主题中接下来的5条卡夫卡消息 我有一个像这样的循环。使用实际正确的参数进行编辑。在本例中,使用者的max.poll.records参数设置为1,因此实际循环只迭代一次。不同的消费者(其中一些人迭代了许多消息)共享一个抽象的父亲(这一个),这就是为什么它是这样编码的。numMss部分是针对该消费者的特别

关于KafkaConsumer(>=0.9),我在尝试为自己的需求实施解决方案时遇到了一些严重的问题

让我们想象一下,我有一个函数,只能读取卡夫卡主题中的n消息

例如:
getMsgs(5)
-->获取主题中接下来的5条卡夫卡消息

我有一个像这样的循环。使用实际正确的参数进行编辑。在本例中,使用者的max
.poll.records
参数设置为1,因此实际循环只迭代一次。不同的消费者(其中一些人迭代了许多消息)共享一个抽象的父亲(这一个),这就是为什么它是这样编码的。
numMss
部分是针对该消费者的特别设置

for (boolean exit= false;!exit;)
{
   Records = consumer.poll(config.pollTime);
   for (Record r:records) 
   {
       processRecord(r); //do my things
       numMss++;
       if (numMss==maximum) //maximum=5
       {   
          exit=true;
          break;
       }
   }
}
考虑到这一点,问题在于poll()方法可能会获得5条以上的消息。例如,如果它收到10条消息,我的代码将永远忘记其他5条消息,因为卡夫卡会认为它们已经被消耗了

我尝试提交补偿,但似乎不起作用:

    consumer.commitSync(Collections.singletonMap(partition,
    new OffsetAndMetadata(record.offset() + 1)));
即使使用偏移量配置,每当我再次启动消费者时,也不会从第6条消息开始(记住,我只想要5条消息),而是从第11条消息开始(因为第一次投票消耗了10条消息)

有什么解决办法吗,或者(最肯定的)我遗漏了什么


提前谢谢

将auto.offset.reset属性设置为“最新”。然后尝试使用,您将从提交的偏移量中获取已使用的记录


或者在轮询之前使用consumer.seek(TopicPartition,offset)api。

通过将enable.auto.commit设置为false禁用了自动提交。如果要手动提交偏移量,则需要禁用该选项。如果没有下一次对poll()的调用,则将自动提交从上一次poll()接收的消息的最新偏移量。

来自Kafka 0.9的auto.offset.reset参数名称已更改

如果Kafka中没有初始偏移量,或者服务器上不再存在当前偏移量(例如,因为该数据已被删除),该怎么办:


您可以将
max.poll.records
设置为您喜欢的任何数字,这样每次轮询最多可以获得这么多记录


对于您在本问题中陈述的用例,您不必自己显式地提交偏移量。您只需将
enable.auto.commit
设置为
true
并将
auto.offset.reset
设置为
earlime
,这样当没有消费者
group.id
时,它就会启动(换句话说,当您第一次开始从分区读取时)。一旦您在Kafka中存储了group.id和一些使用者偏移量,并且如果您的Kafka使用者进程死亡,它将从上次提交的偏移量开始继续,因为这是默认行为,因为使用者启动时将首先查找是否有任何提交的偏移量,如果有,将从上次提交的偏移量开始继续,并且
auto.offset.reset
不会生效

auto.offset.reset应该是最早的,并且只有在没有consumer group.id时才会生效。如果没有组id,则无法存储偏移。如果已经有消费者组id auto.offset.reset,则默认情况下,消费者将从上次提交的offset.5中选择。多年后,仍然感谢您的回答。注意到我没有明确感谢你,所以…迟到总比不到好。谢谢
earliest: automatically reset the offset to the earliest offset

latest: automatically reset the offset to the latest offset

none: throw exception to the consumer if no previous offset is found for the consumer's group

anything else: throw exception to the consumer.