我正在使用RabbitMQ,我希望让多个消费者为同一条消息做不同的事情,这条消息正好在一个队列中。每个消费者都可以独立工作,并且在消费者以他的身份结束的那一刻,它标志着消息已经完成阶段" x" ,当为一条消息完成所有阶段时,然后使用方法a basicAck()
从队列中删除我们的消息。
我怀疑这是不可能的,如果是这样,我会以其他方式面对这一点。具有相同消息的多个队列(使用交换),每个队列具有不同的消费者,其将与服务器通信。然后,该服务器将与数据库一起使用并检查/更新已完成的阶段。完成所有阶段后,以某种方式记录。
但是这种解决方法看起来非常低效,如果可能的话,我想跳过它。
是否可以设置"状态"或者"阶段"在RabbitMQ中的消息?
答案 0 :(得分:1)
所以,首先,在你正在谈论的背景下,一个"消息"是为了完成一些工作单元。
问题的第一部分,参考"标记消息"将消息视为有状态对象。这是不正确的。生成消息后,它是不可变的,这意味着不允许对其进行任何更改。如果您违反或试图违反这一原则,那么您已经超出了声音设计的范围。
所以,让我们重新构建。在正确构建的面向消息的系统中,消息可以表示命令("做某事")或事件("事情发生了#34;)。请注意,有时我们可以将回复消息(响应命令而发送的内容)称为第三类,但它实际上是事件的子类别。
因此,我们有可能将(a)一条消息发送到一个队列,由一个消费者接收,或者(b)一条消息进入多个队列,由许多消费者接收。您将(a)和(b)组成复杂的系统行为,随着时间的推移随着每个小行为的执行而发展,突然间你就会有一个复杂的系统。
事实上,消息确实有状态。他们的状态是'#34;处理"或者"未经处理的",视情况而定。这是他们有状态的限制。
底线
您的情况描述了一系列活动(每个消费者做了什么)对活动中的某种共享状态采取的行动。消息和消息代理的作用是通过提供有关做什么(通过命令)和发生的事情(通过事件)的指导来协助这些活动的编排。 消息本身不能是共享状态。因此,您仍需要某种数据库或其他方法来保持系统状态。没有办法避免这种情况。