当前位置: 首页 > 知识库问答 >
问题:

为什么在kafka python中,消费者最后提交的消息在消费者重启后再次被消费?

傅越
2023-03-14

我将python kafka consumer的< code>auto_commit设置为< code>False,我正在手动提交消息。然而,重启后,消费者再次消费来自每个分区的最后一条消息。只有最后一个,不能再多。

这就是kafka消费群体所展示的:

TOPIC    PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG
my-topic 0          0               1               1
my-topic 1          3               4               1

不知道为什么会显示滞后,whu当前偏移设置为最后一条消息而不是下一条?当我提交偏移量3时,当前偏移量不应该移动到4吗?

我提交我使用的每条消息,但是在重启时,它总是再次使用最后一条消息。

编辑:这是我使用的代码:

self.subscriber = kafka.KafkaConsumer(self.consumer_topic, 
    client_id=self.consumer_name, group_id=group_id,                                              
    bootstrap_servers=self.consumer_bootstrap_server,                                         
    consumer_timeout_ms=timeout_ms, enable_auto_commit=False)

for record in self.subscriber:
    offset = CommittableOffset(record.topic, record.partition, record.offset)
    # process message
    partition = TopicPartition(record.topic, record.partition)
    offset = OffsetAndMetadata(record.offset, None)

    self.subscriber.commit({partition:offset})
    

共有1个答案

邹嘉荣
2023-03-14

事实证明,python kafka库的工作方式与我习惯的Java /Scala库有点不同。在Java /Scala库中,当我提交消息时,实际上提交的是消息偏移量1。在kafka-python库中,我必须自己将偏移量1添加到偏移量中。

 类似资料:
  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?

  • 我们有一个制作人 在开发过程中,我重新部署了producer应用程序,并做了一些更改。但在此之后,我的消费者没有收到任何消息。我尝试重新启动消费者,但没有成功。问题可能是什么和/或如何解决? 消费者配置: 生产者配置: 编辑2: 5分钟后,消费者应用程序死亡,但以下情况除外:

  • 我要求从主题中读取消息,对它们进行批处理,然后将批处理推送到外部系统。如果批处理因任何原因失败,我需要再次使用同一组消息并重复该过程。因此,对于每个批处理,每个分区的 from 和 to 偏移量都存储在数据库中。为了实现这一点,我通过向读取器分配分区来为每个分区创建一个Kafka使用者,基于先前存储的偏移量,使用者寻求该位置并开始读取。我已关闭自动提交,并且不提交来自使用者的偏移量。对于每个批处理

  • 我在kafka中面临一个奇怪的问题,即在消费者应用程序重新启动后,所有来自主题的kafka消息都在重播。有人能帮我我在这里做错了什么吗? 这是我的配置: spring.kafka.consumer.auto-偏移-重置=最早 spring.kafka.enable.auto。提交=false 我的生产者配置: 消费者配置: 消费者代码: 集装箱代码 消费者配置 应用程序.属性

  • 我有一种在shell中执行此任务的方法:如何使kafka消费者从上次消耗的偏移量读取,而不是从开始读取 但是,我愿意在Python中这样做,使用 我找不到任何关于这种情况的api。 http://kafka-python.readthedocs.io/en/latest/apidoc/KafkaConsumer.html

  • 我有一个简单的Kafka设置。生成器正在以较高的速率向单个分区生成具有单个主题的消息。单个使用者正在使用来自此分区的消息。在此过程中,使用者可能会多次暂停处理消息。停顿可以持续几分钟。生产者停止产生消息后,所有排队的消息都将由使用者处理。生产者产生的消息似乎不会立即被消费者看到。我使用的是Kafka0.10.1.0。这里会发生什么?下面是使用消息的代码部分: 代理上的所有配置都保留为kafka默认