gpt4 book ai didi

rabbitmq - 关于RabbitMQ/AMQP中的消息顺序保证

转载 作者:行者123 更新时间:2023-12-02 21:43:55 26 4
gpt4 key购买 nike

消息队列服务(包括 RabbitMQ)的主要特征之一是保留消息发布顺序。这在 RabbitMQ documentation 中得到了证实。 :

[QUOTE 1] Section 4.7 of the AMQP 0-9-1 core specification explains theconditions under which ordering is guaranteed: messages published inone channel, passing through one exchange and one queue and oneoutgoing channel will be received in the same order that they weresent. RabbitMQ offers stronger guarantees since release 2.7.0.

为了简化事情,我们假设下面没有活跃的消费者。我们通过一个 channel 发布内容。

到目前为止,一切顺利。

RabbitMQ 还可以通知发布者某个发布已被完整且正确地处理[*]。这是解释here 。基本上,代理将发送 basic.ackbasic.nack 消息。文档还这样说:

[QUOTE 2] basic.ack for a persistent message routed to a durable queue will besent after persisting the message to disk.

In most cases, RabbitMQ will acknowledge messages to publishers in thesame order they were published (this applies for messages published ona single channel). However, publisher acknowledgements are emittedasynchronously and can confirm a single message or a group ofmessages. The exact moment when a confirm is emitted depends on thedelivery mode of a message (persistent vs. transient) and theproperties of the queue(s) the message was routed to (see above).Which is to say that different messages can be considered ready foracknowledgement at different times. This means that acknowledgementscan arrive in a different order compared to their respective messages.Applications should not depend on the order of acknowledgements whenpossible.

乍一看,这是有道理的:持久化消息比仅仅将其存储在内存中花费更多的时间,因此很可能稍后的瞬时消息的确认将在较早的持久消息的确认之前到达。

但是,如果我们重新阅读上面关于消息顺序的第一个引用[QUOTE 1],就会变得困惑。我会解释一下。假设我们向同一个交换发送两条消息:首先是持久消息,然后是瞬时消息。由于 RabbitMQ 声称保留消息顺序,因此在知道第一条/持久消息确实已完全写入磁盘之前,它如何发送第二条/瞬时消息的确认?

换句话说,上面关于不逻辑确认顺序的评论[QUOTE 2]仅适用于两条消息各自路由到完全不同的目标队列的情况(如果例如,他们有不同的路由 key )?在这种情况下,我们不必保证[QUOTE 1]中所做的任何事情。

[*] 在大多数情况下,这意味着“排队”。但是,如果没有适用的路由规则,则无法将其排入目标队列。然而,对于发布确认而言,这仍然是一个积极的结果。

更新

我读了这个answer关于类似的问题。这基本上表明没有任何保证。即使是最简单的实现(我们将消息 2 的发布延迟到收到消息 1 的确认之后),也可能不会产生所需的消息顺序。基本上,[QUOTE 1] 不满足。

这是正确的吗?

最佳答案

来自this response on rabbitmq-users :

RabbitMQ 知道消息在队列中的位置,无论它是否是 transient 的。

我的猜测(我没有写文档的这一部分)ack 排序部分主要试图传达这样的信息:如果两条消息被路由到两个不同的队列,这些队列将同时处理/复制/保留它们。推理在多个队列中订购是相当困难的。一条消息也可以进入多个队列。

尽管如此,RabbitMQ 队列知道消息在哪个队列中的位置。一旦处理发布的 channel 收到所有路由/传递确认,它就会被添加到要发送的确认列表中。请注意,列表的排序方式可能会或可能不会与原始发布的方式相同,并且由于多种原因而担心这是不切实际的,最重要的是:用户通常主要关心队列中的排序。

<小时/>

注意: RabbitMQ 团队监控 the rabbitmq-users mailing list并且有时只在 StackOverflow 上回答问题。

关于rabbitmq - 关于RabbitMQ/AMQP中的消息顺序保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53596761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com