AMQP按顺序将消息路由到多个队列

时间:2015-04-19 01:59:44

标签: c# routing rabbitmq amqp

小背景

  • 我的应用程序向交易所发布消息,此应用程序不知道消息需要去哪里,或者它将去哪里。
  • 消息需要经过管道中的几个步骤(队列)。为简单起见,我们将其称为pre-process processpost-process

我的问题是

AMQP(具体是Rabbit-mq)中有什么可以帮助我按顺序处理这些消息吗? (pre-process,然后是process,然后是post-process)。

Ideal

我目前知道的解决方案

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

    我遇到的唯一问题是,我不一定要知道pre-process服务,或者关心消息接下来要去哪里。如果我需要在pre-processprocess之间添加其他服务,我必须更改pre-process中的应用代码或配置,然后还要确保新服务也知道下一步是process

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

Rabbit具有出色的路由功能,但它不进行服务编排。它更像是可以依赖消息队列的服务总线的范围。

您可以优化1.:

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

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

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

    因此每个服务必须包含路由逻辑。

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

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

答案 1 :(得分:0)

我认为,您可以使用 主题交换 https://www.rabbitmq.com/tutorials/tutorial-five-dotnet.html)。 您可以将处理历史记录编码为路由密钥。

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

第二个处理器可以在同一个交换上订阅路由密钥为“raw.proc1”的消息。

第三个处理器可以在同一个交换上查找路由密钥为“raw.proc1.proc2”的消息,依此类推。