【问题标题】:RabbitMQ Message StatesRabbitMQ 消息状态
【发布时间】:2018-03-07 11:31:05
【问题描述】:

我正在使用 RabbitMQ,我想让多个消费者为同一条消息做不同的事情,这条消息正好在一个队列中。每个消费者都可以自己工作,并且在消费者结束的那一刻对于他来说,它将消息标记为已完成阶段 "x" ,当一条消息的所有阶段都完成时,然后使用方法 a basicAck() 将我们的消息从队列中删除。

我怀疑这是不可能的,如果是这样,我会以其他方式面对。具有相同消息的多个队列(使用交换器),每个队列具有不同的消费者,它们将与服务器通信。然后,该服务器将使用数据库并检查/更新已完成的阶段。当所有阶段都完成后,以某种方式记录下来。

但是这种解决方法似乎效率极低,如果可能,我想跳过它。

是否可以在 rabbitMQ 中为消息设置“状态”或“阶段”?

【问题讨论】:

  • 我认为您正在寻找数据库,而不是消息队列。
  • 我也是。可悲的是,这不是我的决定……

标签: rabbitmq queue state message


【解决方案1】:

因此,首先,在您所谈论的上下文中,“消息”是执行某些工作单元的命令。

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

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

因此,我们可能会出现以下情况:(a) 一条消息进入一个队列,被一个消费者接收,或者 (b) 一条消息进入多个队列,被多个消费者接收。您将 (a) 和 (b) 组合成复杂的系统行为,这些行为会随着这些小行为的执行而随着时间的推移而演变,突然间您就拥有了一个复杂的系统。

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

底线

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2013-08-09
    • 2012-05-29
    • 2019-03-31
    相关资源
    最近更新 更多