【问题标题】:Process Messages Sequentially with competing consumers与竞争的消费者按顺序处理消息
【发布时间】:2017-03-29 05:24:00
【问题描述】:

问题:

  • 我以特定顺序 (FIFO) 在队列中接收消息(比如订单)
  • 队列中有竞争的消费者
  • 为了进一步增加复杂性,消费者可能只对订单的特定版本感兴趣,具体取决于其状态。(例如版本 1、版本 2 和版本 5)
  • 订单版本号在订单上可用,但不能用于排序,因为我的听众可能对所有版本都不感兴趣(消费者可能只对版本感兴趣,比如版本 1、版本 2 和版本 5)

我如何确保按照收到消息的顺序处理消费者之间的消息?

【问题讨论】:

    标签: design-patterns jms integration messaging


    【解决方案1】:

    你不能拥有多个消费者,至少不能使用基础 JMS。您需要提供逻辑。

    我想到的解决方案都很糟糕,因为它利用了异步集成的优点并试图使其同步。对于每个附加了版本的“对象”或“消息”或“类型”,您可以跟踪您收到的版本并尝试保证它们按顺序处理。如果消费者收到乱序的消​​息,消费者可能会停止跟踪或重新排队消息,但任何一种解决方案都有一些麻烦。

    如果有一组有限的对象进行了版本控制,并且您可能多次看到这些对象,您可以使用消息选择器来确保给定的消费者是唯一可以看到该特定 ID 消息的消费者。

    如果您的 JMS 提供程序支持优先队列,您可以分配不同的优先级,并希望这会以适当的顺序提供它们,但即使这样似乎也有一个竞争条件。

    我再问一个问题:您使用的是正确的技术吗?

    【讨论】:

    • 感谢斯科特的回复。我确实想过有一个分布式存储来识别我们正在处理的版本,但它不适用于识别第一个事件。 (想象版本 1 由 Listener 1 处理,version2 由 Listener 2 处理。我们不能保证 order sinc 两者在查找时都可能找不到记录)。在我们的例子中,它也不是有限集。我们需要一个 FIFO 队列和保证交付和其他故障转移机制。很想听听您对任何其他可以考虑的技术的看法
    • 除了通过单个消费者进行序列化之外,不知道有没有解决办法,如果不能确定状态(即v2可能/可能不是第一个要处理的事件,也没有办法检查)然后不确定是否有可行的解决方案。在尝试编写代码之前,您需要将状态图放在一起......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2010-12-12
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多