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

Kafka仅有一次消费保证

时修贤
2023-03-14

我在一些关于堆栈溢出的答案中看到,通常在web中也看到,Kafka不支持消费确认,或者消费一次就很难实现。

在以下作为示例的条目中,有没有理由使用RabbitMQ而不是Kafka?,我可以读到以下语句:

RabbitMQ将保留已消耗/已确认/未确认消息的所有状态,而Kafka则不保留

有人能解释一下为什么Kafka的“一次消费保证”很难实现吗?这与Kafka和RabbitMQ等其他更传统的消息代理有何不同?我错过了什么?

共有1个答案

申嘉慕
2023-03-14

如果你的意思是一旦问题是这样的话。您可能知道的Kafka消费者使用轮询机制,即消费者向服务器询问消息。另外,您需要回忆一下使用者提交消息的偏移量,也就是说,它告诉集群下一个预期的偏移量是什么。想象一下会发生什么。

消费者轮询消息并获取偏移量=1的消息。

A)如果使用者在处理消息之前立即提交了偏移量,那么它可能崩溃,且再也不会接收到该消息,因为它已经提交了,在下一次轮询时,Kafka将返回偏移量=2消息。这是他们所称的最多一次语义。

B)如果使用者首先处理该消息,然后提交偏移量,那么可能发生的情况是,在处理该消息之后但在提交之前,使用者崩溃,因此在这种情况下,下一轮投票将再次获得偏移量=1的相同消息,并且该消息将被处理两次。这就是他们所说的至少一次。

为了精确地实现一次,您需要在原子操作中处理消息并提交该偏移量,在原子操作中您总是同时执行或不执行这两个操作。这不是那么容易的。这样做的一种方法(如果可能的话)是存储处理的结果以及生成该结果的消息的偏移量。然后,当consumer启动时,它寻找Kafka之外的最后一个处理过的偏移量,并寻找该偏移量。

 类似资料:
  • 当我只打开一次处理时,我会得到以下错误。注意:我们的应用程序非常安全,我们只允许Kafka用户和消费者访问他们明确需要的资源。 只有一次处理kafka流是否在所有流任务中使用每个流任务的消费者组而不是消费者组?

  • 我在本地机器上安装了Kafka,并启动了zookeeper和一个代理服务器。 现在我有一个单独的主题,描述如下: 我有一个生产者在消费者启动之前产生了一些消息,如下所示: 当我使用--从头开始选项启动消费者时,它不会显示生产者生成的所有消息: 但是,它显示的是新添加的消息。 我在这里怎么了?有什么帮助吗?

  • null 我在这一页上读到以下内容: 使用者从任何单个分区读取,允许您以与消息生成类似的方式扩展消息消耗的吞吐量。 也可以将使用者组织为给定主题的使用者组-组内的每个使用者从唯一分区读取,并且组作为一个整体使用来自整个主题的所有消息。 如果使用者多于分区,则某些使用者将空闲,因为它们没有可从中读取的分区。 如果分区多于使用者,则使用者将从多个分区接收消息。 如果使用者和分区的数量相等,则每个使用者

  • 我刚接触Kafka,很少阅读教程。我无法理解使用者和分区之间的关系。 请回答我下面的问题。 > 消费者是否由ZK分配到单个分区,如果是,如果生产者将消息发送到不同的分区,那么其他分区的消费者将如何使用该消息? 我有一个主题,它有3个分区。我发布消息,它会转到P0。我有5个消费者(不同的消费者群体)。所有消费者都会阅读P0的信息吗?若我增加了许多消费者,他们会从相同的P0中阅读信息吗?如果所有消费者

  • 我试图使用kafka流库只使用一次kafka的功能。我只将proessing.guarantee配置为exactly_once。与此同时,需要将事务状态存储在内部主题(__transaction_state)中。 我的问题是,如何定制主题的名称?如果kafka集群由多个消费者共享,那么每个消费者是否需要不同的事务管理主题? 谢谢你,墨蒂

  • 我有一个Kafka系统,看起来像这样(所有消费者都在一个消费者群体中): 在每个消费者中,我轮询消息,然后进行昂贵的计算(从1到60秒)。如果操作成功,我将提交消费者。 在我提交之前,另一个使用者是否会开始处理相同的消息?我需要保证,一旦消息被拾取,它就会被只执行一次 - 除非处理中途失败。