【问题标题】:Using a Kafka consumer in order for a message to be consumed by exactly once semantics使用 Kafka 消费者以使消息被恰好一次语义消费
【发布时间】:2019-02-27 23:44:42
【问题描述】:

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

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

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

有人可以建议如何配置 Kafka Consumer 以实现上述目标吗?

【问题讨论】:

  • 欢迎提供任何其他相关信息
  • 我认为您误解了 Kafka 中“恰好一次”的含义,但是一旦阅读,消息就不会从主题中删除。消费者不会通知代理他们已读取数据,只提交消费者组的偏移量
  • 非常感谢您的意见@cricket_007 我将再次讨论这些概念。你的评论很有趣。
  • 在一个完美的世界里,消息永远不会被消费者组读取超过一次,但是会发生网络/应用程序故障,这可能导致偏移量不被提交,因此消费者将能够重新 -阅读消息,因为它必须从较早的偏移量重新开始......我个人没有玩过交易功能来了解消费者如何处理这些情况,但你可以在这里找到博客系列confluent.io/blog/enabling-exactly-kafka-streams

标签: apache-kafka kafka-consumer-api


【解决方案1】:

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

另外,您可能需要了解 Kafka 的实际工作原理。您在 Kafka 中发布到主题的消息本身是异步的。您的生产者不必担心谁使用它或消息发布后会发生什么。

然后,您的交付服务中的消费者应该订阅主题。如果您希望您的交付服务只使用一次消息,那么您的交付服务的消费者应该在同一个组中(相同的组 ID)。 Kafka 负责确保由其中一个消费者(在同一组中)消费的消息不会对其他消费者可用。

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

【讨论】:

    【解决方案2】:

    很好的问题,我们很多人在部署和使用 Kafka 时都在纠结。事实上,我从事的一个项目曾多次尝试将 Kafka 用于您描述的用例,但收效甚微。

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

    1. 请求->回复
    2. 发布/订阅
    3. 排队(这是您尝试做的)

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

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

    【讨论】:

      【解决方案3】:

      我认为您本质上是希望将 Kafka 用作传统的消息队列(例如 Rabbit MQ),其中消息在使用后被删除。关于这一点已经有很多争论。一如既往,各有优劣。

      this post 上的答案或多或少与这个想法背道而驰......

      不过……

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

      我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2020-08-11
        • 1970-01-01
        • 2019-08-25
        • 2017-09-23
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多