小背景
pre-process
process
和post-process
。我的问题是
AMQP(具体是Rabbit-mq)中有什么可以帮助我按顺序处理这些消息吗? (pre-process
,然后是process
,然后是post-process
)。
我目前知道的解决方案
处理服务本身的路由逻辑,因此pre-process
服务必须知道下一步是process
。服务将处理将消息发布到下一个交换或队列。
我遇到的唯一问题是,我不一定要知道pre-process
服务,或者关心消息接下来要去哪里。如果我需要在pre-process
和process
之间添加其他服务,我必须更改pre-process
中的应用代码或配置,然后还要确保新服务也知道下一步是process
。
使用某种类型的服务总线。
我对服务总线了解不多,但我认为这就是它要处理的问题 我对服务总线唯一的问题是我所看到的所有实现(NServiceBus,MassTransit)看起来都非常重要。他们有自己的新术语集,它们有很多功能,如果出现问题,我们现在需要成为这种特定总线技术的专家,它们似乎为这个过程增加了大量不必要的复杂性。
创建自己的路由器服务。
每条消息都会在其标题中包含有关哪个队列命中的信息。然后,路由器将负责将消息发送到正确的服务。每个服务总是在完成工作后将其消息发布回路由器。
做这样的事有什么味道吗?我看到的唯一问题是,看起来我们基本上从我们的队列系统中获得了很多控制权,而队列系统具有非常好的路由功能。
关于此事的任何想法,或来自战壕的一些例子都会很棒。
答案 0 :(得分:1)
Rabbit具有出色的路由功能,但它不进行服务编排。它更像是可以依赖消息队列的服务总线的范围。
您可以优化1.:
消息是自给自足的,包含所有路由逻辑。
例如,消息可以包含具有与处理链相关联的所有路由逻辑的头。例如,属性routings
:
"routings": ["pre-process" , "process", "post-process"]
因此,流程步骤不需要知道下一个流程步骤。它弹出routings
数组的第一个条目,并将下一条消息发送到此队列。如果处理步骤是线性的,则非常合适,不需要条件步骤或历史记录。
因此每个服务必须包含路由逻辑。
第三种解决方案更易于管理(服务之间的关注分离)。一个服务负责路由,它通过RabbitMQ调用适当的流程步骤。气味可能是它需要比第一个解决方案更多的消息。这个缺点的成本取决于您的要求。事实上,为了改善这一点,您将趋向于服务总线,这将是解决方案1)和3)的混合。
我在工作中使用了第三种解决方案。处理步骤由状态机定义。
答案 1 :(得分:0)
我认为,您可以使用 主题交换 (https://www.rabbitmq.com/tutorials/tutorial-five-dotnet.html)。 您可以将处理历史记录编码为路由密钥。
第一个处理器可以使用私有队列绑定到已知的 exchange ,并使用路由密钥“raw”订阅消息(例如),并在同一个交换
第二个处理器可以在同一个交换上订阅路由密钥为“raw.proc1”的消息。
第三个处理器可以在同一个交换上查找路由密钥为“raw.proc1.proc2”的消息,依此类推。