RabbitMQ 消息状态

RabbitMQ Message States

我正在使用 RabbitMQ,我希望有多个消费者对同一条消息做不同的事情,这条消息正好在一个 queue.Each 消费者会自己工作,并且在当消费者结束他的部分时,它将消息标记为已完成阶段 "x" ,当一条消息的所有阶段都完成后,然后使用方法 a basicAck() 从队列中删除我们的消息。

我怀疑这是不可能的,如果是这样,我会换一种方式面对这件事。有多个队列具有相同的消息(使用交换器),每个队列具有不同的消费者,这些消费者将与服务器通信。然后该服务器将使用数据库和 checking/updating 完成的阶段。当所有阶段完成后,以某种方式记录它。

但是这个变通办法似乎非常低效,如果可能的话我想跳过它。

是否可以将 "states" 或 "phases" 设置为 rabbitMQ 中的消息?

因此,首先,在您所说的上下文中,"message" 是执行某些工作单元的命令。

你的问题的第一部分,通过引用 "marking the message" 将消息视为有状态对象。这是不正确的。一旦消息被生成,它就是不可变的,这意味着不允许对其进行任何更改。如果您违反或试图违反此原则,您就已经超出了声音设计的范围。

所以,让我们重构一下。在 properly-archtiected message-oriented 系统中,消息可以表示 命令 ("do something") 或 事件 ("something happened")。请注意,有时我们可以将回复消息(响应命令而发送的内容)称为第三类,但它实际上是一个 sub-category 事件。

因此,我们有可能 (a) 一条消息进入一个队列,由一个消费者接收,或者 (b) 一条消息进入多个队列,由多个接收消费者。你把 (a) 和 (b) 组合成复杂的系统行为,这些行为随着时间的推移随着每个小行为的执行而演变,突然间你就有了一个复杂的系统。

消息确实有状态。它们的状态是 "processed" 或 "unprocessed",视情况而定。这是他们状态的极限。

底线

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