提问者:小点点

使用Kafka消费者,以便消息被恰好一次语义消费


我是Kafka的新手,我正在寻求如何使用Kafka的指导,以便实现以下消息模式:

首先,我希望消息是异步的,而且它需要被“消费”,即单个消费者应该消费它,而其他消费者此后将不能消费它。

此消息模式的一个用例是,当您有多个“传递服务”实例,并且您只希望其中一个实例使用消息时(这假设由于某种原因无法利用幂等性)。

有人能告诉我如何配置Kafka消费者以实现上述目标吗?


共3个答案

匿名用户

我认为您本质上希望将Kafka用作传统的消息队列(例如Rabbit MQ),其中消息在消费后被删除。关于这一点有很多争论。事实总是如此,双方都有优点和缺点。

这篇文章的答案或多或少地反对这个想法。。。

然而。。。

这篇文章讨论了一种如何尝试并使其发挥作用的方法。消息不会被删除,但方法非常相似。这是一篇相当全面的文章,涵盖了开销和优化,您可以探索这些优化来提高效率。

我希望这有帮助!

匿名用户

这是一个很好的问题,也是我们在部署和使用Kafka时经常遇到的问题。事实上,我所从事的一个项目曾多次尝试在您描述的用例中使用Kafka,但收效甚微。

简而言之,在处理消息传递时会遇到一些消息交换模式:

    < li >请求-

无需深究原因,Kafka实际上只是为了发布/订阅而构建的。还有其他产品分别实现了其他功能,还有一个产品实际上实现了所有这三个功能。

所以我有一个问题要问你,你愿意在这个项目中使用Kafka以外的东西吗?

匿名用户

您可以使用Spring kafka来执行此操作。Spring Kafka负责许多配置和样板代码。在此处查看示例https://www.baeldung.com/spring-kafka.这应该会让您开始。

此外,您可能需要阅读Kafka的实际工作原理。您发布到Kafka主题的消息是本机异步的。你的制作人不担心谁会使用它,也不担心消息发布后会发生什么。

那么交付服务中的消费者应该订阅这些主题。如果您希望您的传递服务只消费一次消息,那么您的传递服务的消费者应该在同一个组中(同一个组id)。Kafka负责确保由(同一组中的)一个消费者消费的消息不会被其他消费者获得。

默认消息保留期为七天,可在Kafka中配置。