【问题标题】:Ensuring ordered processing of messages确保消息的有序处理
【发布时间】:2019-11-07 11:10:06
【问题描述】:

所以我有一个微服务架构的情况,我需要保证具有公共标识符的传入消息将按来自 kafka 的顺序进行处理:

      message2, message1 kafka
     ------------------------------
             |message1       |message2
             |               |
         Instace1         Instance2

在下面的示例中,我有两个服务实例正在处理来自 kafka 的消息,但我想确保 message2 仅在 message1 之后处理。

显然,这种情况很容易解决,只需将一个实例配置为仅从特定分区消费,该分区将使用通用标识符存储消息:

message2, message1 kafka
--------------------------------
       | message2
       | message1
     Instance1        Instance2

现在订单有保障,message2 永远不会在message1 之前处理。

但是,我想知道这个问题是否可以通过其他方式解决,直接在代码中而不是依赖于基础架构?这看起来可能是微服务架构中的标准问题,但我不确定解决它的首选方法是什么?

【问题讨论】:

标签: java spring-boot apache-kafka microservices


【解决方案1】:

我建议将基础设施作为更“正确”的方式,但应该可以用代码解决这个问题:

如果您有一个消息生产者,请在消息中附加直接在前的消息的标识符,并在使用该消息之前确保您之前使用过直接在前的消息。

如果您有多个生产者,这会有点棘手,因为您必须同步标识符。

再次,我建议基础架构是解决这个问题的更“正确”的方法(您编写的代码越少,复杂度越低,错误就越少)。

【讨论】:

  • 有趣的解决方案,但假设只有一个生产者: 1. 为什么我需要检查所有先前消息的标识符,仅检查最后一条消息的标识符还不够?如果我真的需要所有标识符,那是否意味着消息最终可能会包含数十万个标识符? 2. 你到底是什么意思在消费消息之前检查?我认为消费过程在 Spring 中是自动的,不知道如何在从 kafka 消费之前检查消息是否满足条件?谢谢。
  • 1.你当然是正确的——你只需要最后一个。
  • 2.据我所知,你必须自己实现这个 - 保留你在内存/db中处理的最后一个标识符,并且对于每条新消息 - 如果它直接跟随,则按预期处理它。否则 - 在 X 秒内重试处理(希望届时将使用“直接跟随”消息)。
  • 如果这是一个合适的答案,您会考虑接受吗?
【解决方案2】:

Kafka 只保证订购within a partition

因此,如果您希望在“message2”之前处理“message1”,则需要确保两条消息最终位于同一分区上。那么任何阅读这些消息的消费者都可以保证按照它们产生的顺序看到它们。

【讨论】:

  • 是的,我知道这一点,是的,它解决了我的问题。但是,我想知道实际上不使用基础设施而是依靠代码来解决此类问题是否有意义?我真的不确定我该如何解决这个问题
  • 我建议依靠 Kafka 来获得严格的订购保证。不确定您的用例是什么或您需要什么样的保证,但如果您想涵盖多个客户端的场景,则按顺序使用来自多个分区的消息并非易事
【解决方案3】:

您可以禁用自动提交功能并手动提交您使用的消息的偏移量。 查看this 链接以了解如何配置它。 然后,通过拥有一个保存消息的最后使用索引的变量,您可以做您想做的事情,但您必须确保一个单独的代码实例一次可以访问此变量。您可以使用另一个微服务来存储/使用信号量之类的东西来保护这个值。

所以,每个消费者都会等待,直到当前消息之前的所有消息都被消费完,然后开始消费该消息以保存消息的顺序。

但是这种解决方案增加了代码的复杂性,在这种情况下使用多个消费者有什么好处?在最好的情况下,在性能方面,如果您想保存订单或消息,则使用 1 个消费者或 10 个消费者之间没有区别,因为消费者必须等到之前的消息到达。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多