RabbitMQ消息状态

RabbitMQ消息状态,rabbitmq,queue,state,message,Rabbitmq,Queue,State,Message,我正在使用RabbitMQ,我想让多个使用者对同一条消息执行不同的操作,该消息正好位于一个队列中。每个使用者都将自己工作,在使用者结束其部分时,它将消息标记为已完成阶段“x”,当一条消息的所有阶段都已完成时,然后使用方法abasicAck()从队列中删除消息 我怀疑这是不可能的,如果是的话,我会以另一种方式面对。具有多个具有相同消息的队列(使用exchange),每个队列具有不同的使用者,这些使用者将与服务器通信。然后,该服务器将使用数据库并检查/更新已完成的阶段。所有阶段完成后,以某种方式记录

我正在使用RabbitMQ,我想让多个使用者对同一条消息执行不同的操作,该消息正好位于一个队列中。每个使用者都将自己工作,在使用者结束其部分时,它将消息标记为已完成阶段“x”,当一条消息的所有阶段都已完成时,然后使用方法a
basicAck()
从队列中删除消息

我怀疑这是不可能的,如果是的话,我会以另一种方式面对。具有多个具有相同消息的队列(使用exchange),每个队列具有不同的使用者,这些使用者将与服务器通信。然后,该服务器将使用数据库并检查/更新已完成的阶段。所有阶段完成后,以某种方式记录

但是这个解决方法似乎非常无效,如果可能的话,我想跳过它


在rabbitMQ中为消息设置“状态”或“阶段”可能吗?

因此,首先,在您所讨论的上下文中,“消息”是完成某个工作单元的命令

问题的第一部分提到“标记消息”,将消息视为有状态对象。这是不正确的。消息一旦生成,它是不可变的,这意味着不允许对其进行任何更改。如果您违反或试图违反这一原则,那么您已经超越了声音设计的领域

所以,让我们重新定义。在正确构造的面向消息的系统中,消息可以表示命令(“做某事”)或事件(“发生了某事”)。请注意,有时我们可以将回复消息(响应命令而发送的消息)称为第三类,但它实际上是事件的子类

因此,我们有可能(a)一条消息发送到一个队列,由一个消费者拾取,或(b)一条消息发送到多个队列,由多个消费者拾取。你需要(a)和(b)来组成复杂的系统行为,这些行为随着时间的推移随着这些小行为的执行而演变,突然你就有了一个复杂的系统

事实上,消息确实具有状态。它们的状态是“已处理”或“未处理”,视情况而定。这是他们的状态的极限

底线


您的情况描述了一系列活动(每个消费者所做的事情)在这些活动之间的某种共享状态下被执行。消息和消息代理的作用是通过提供关于要做什么(通过命令)和发生什么(通过事件)的说明来协助这些活动的编排。消息本身不能是共享状态。因此,您仍然需要某种数据库或其他方法来保持系统的状态。这是无法避免的。

我想你在找数据库,而不是消息队列。我也是。不幸的是,这不是我的决定。。。