【问题标题】:AMQP routing messages to multiple queues in orderAMQP 将消息按顺序路由到多个队列
【发布时间】:2015-04-19 01:59:43
【问题描述】:

小背景

  • 我的应用程序将消息发布到交换器,此应用程序不知道消息需要发送到哪里或将发送到哪里。
  • 消息需要通过管道中的几个步骤(队列)。为简单起见,我们将它们称为 pre-process processpost-process

我的问题是

AMQP(特别是 Rabbit-mq)中是否有任何东西可以帮助我按顺序处理这些消息? (pre-process,然后是process,然后是post-process)。

我目前知道的解决方案

  1. 在服务本身中处理路由逻辑,因此pre-process 服务必须知道下一步是process。服务将处理将消息发布到下一个交换或队列。

    我对此的唯一问题是,我不一定希望pre-process 服务知道,或者关心消息接下来要去哪里。如果我需要在pre-processprocess 之间添加另一个服务,我必须更改pre-process 中的应用程序代码或配置,然后还要确保新服务也知道下一步是@ 987654334@.

  2. 使用某种类型的服务总线。

    我对服务总线了解不多,但我认为这就是它的用途。
    我对服务总线的唯一问题是我看过的所有实现(NServiceBus、MassTransit)看起来都很重量级。他们有自己的一套新术语,他们有很多特性,如果出现问题,我们现在需要成为这种特定总线技术的专家,他们似乎给这个过程增加了大量不必要的复杂性。

  3. 创建我自己的路由器服务。

    每条消息的标题中都会包含有关它被击中的队列的信息。然后路由器将负责将消息发送到正确的服务。每个服务在完成工作后总是会将其消息发布回路由器。

    做这样的事情有什么气味吗?我看到的唯一问题是,看起来我们基本上从我们的队列系统中拿走了很多控制权,而队列系统具有非常好的路由功能。

关于此事的任何想法,或战壕中的一些例子都会很棒。

【问题讨论】:

    标签: c# routing rabbitmq amqp


    【解决方案1】:

    Rabbit 具有强大的路由功能,但它不做服务编排。它更多的是可以依赖消息队列的服务总线的范围。

    你可以细化1.:

    1. 消息是自给自足的,包含所有路由逻辑。 例如,消息可以包含一个标头,其中包含与处理链相关联的所有路由逻辑。例如属性routings

      "routings": ["pre-process" , "process", "post-process"]

      所以一个流程步骤不需要知道下一个流程步骤。它弹出routings 数组的第一个条目并将下一条消息发送到此队列。如果处理步骤是线性的,则非常适合,不需要条件步骤或历史化。

      所以每个服务都必须包含路由逻辑。

    第三种解决方案更易于管理(服务之间的关注点分离)。一项服务负责路由,它通过 RabbitMQ 调用适当的流程步骤。气味可能是它需要比第一个解决方案更多的消息。这个缺点的成本取决于您的要求。事实上,为了改善这一点,您将倾向于使用混合了解决方案 1) 和 3) 的服务总线。

    我在工作中使用了第三种解决方案。处理步骤由状态机定义。

    【讨论】:

      【解决方案2】:

      我想,你可以玩话题交流 (https://www.rabbitmq.com/tutorials/tutorial-five-dotnet.html)。 您可以将处理历史编码为路由键。

      第一个处理器可以使用私有队列绑定到已知的exchange,并使用路由键“raw”(例如)订阅消息,并在同一 交换

      第二个处理器可以在同一exchange上订阅带有路由键“raw.proc1”的消息。

      第三个处理器可以在同一exchange上查找带有路由键“raw.proc1.proc2”的消息,依此类推。

      【讨论】:

        猜你喜欢
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多