- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
消息队列服务(包括 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.ack
或 basic.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/
我想读取 RabbitMQ 队列中未确认消息的负载或 messageId。这可能吗? 我想这样做的原因是我尝试使用 RabbitMQ 死信功能来构建一个循环以定期自动生成消息。简而言之,创建两个队列
除了 vFabric 由 VMWare 提供商业支持之外,vFabric RabbitMQ 和 RabbitMQ 之间的主要区别是什么? 最佳答案 来自 source : We also produc
RabbitMQ 集群中有如下三个节点。 在 RabbitMQ 中,有两个队列,q1 和 q2。 q1 和q2 的主副本分布在不同的节点上。两个队列都被其他节点镜像。 三个节点前面有一个负载均衡器。
我希望在谷歌计算引擎上实现 rabbitmq 来处理我的 android 和 ios 消息传递应用程序上的消息。我听说 rabbitmq 可能非常耗电,所以我想知道解决这个问题的最佳解决方案是什么?我
是否可以在 RabbitMQ 服务器(管理插件 View )中查看连接单元的主机名,而不仅仅是 IP/端口?我们使用动态连接位置,这样更容易识别客户...... 最佳答案 不,没有这样的内置功能。 作
我正在阅读 RabbitMQ in Action 书,仍在第 2 章中,但作者说的一件事让我感到困惑。您设置了一个交换并发送了一条消息,两个订阅者正在监听队列。当第一条消息进来时,第一个订阅者得到它,
我正在使用 RabbitMQ 将所有消息排队,并将消息作为 SMS 发送给各个消费者。我正在使用直接交换,并且我已经正确地创建了一个到带有路由键的队列的绑定(bind)。问题是,当我尝试发布消息时,我
我们正在使用微服务架构在 nodejs 中实现 Web-API。每个服务都会公开 HTTP 端点,以便应用程序/网站可以与其交互。为了同步不同的数据库,我们目前使用 RabbitMQ。微服务可以在扇出
我计划在 RabbitMQ 消息头中存储堆栈跟踪。消息 header 是否有大小限制? 最佳答案 RabbitMQ 默认使用 AMQP 版本 0.9.1。根据AMQP protocol specifi
无法理解 exclusive queue 和 exclusive consumer 之间的区别,想知道我是否理解正确。 假设我有一个 queue、consumer1 和 consumer2。 我的理解
发布到 RabbitMQ 队列(发布/订阅模型)时消息的最大大小是多少? 我在文档中看不到任何明确的限制,但我认为有一些指导方针。 提前致谢。 最佳答案 我在做比较亚马逊队列服务和 RabbitMQ
我可以使用 Publish/Subscribe 创建扇出交换RabbitMQ Java 教程,任何连接的消费者都会收到一条消息的副本。我不想以动态/编程方式声明交换和绑定(bind),而是想在连接任何
java的 native rabbitmq客户端允许在连接设置上设置心跳,例如: import com.rabbitmq.client.ConnectionFactory; ... Connectio
我开始着手一个新项目,我们被要求将系统构建为一系列微服务,使用 RabbitMQ 作为它们之间的通信层。 在开发 REST API 时,我倾向于使用接受 HTTP header 来控制版本控制,我看到
在 Rabbit MQ 中使用集群时,我计划使用竞争订阅者模式。 Producer : 1 Exchange : 1 direct Queue : 1 Consumers : n (multiple)
是否可以实现 aggregator pattern在 RabbitMQ 中? 我有 A … N在发送到另一个队列之前我需要等待/聚合的消息 X . 所以我想我会有一些 唯一 ID 确保消息被路由 独家
我正在使用RabbitMQ向用户发送通知。用户可以随时读取其队列。 我面临的问题是,队列在夜间充满了很多通知,而当用户在早上返回时,他必须顺序处理这些消息。这些通知中有很多甚至是重复的。 我认为在发布
是否可以延迟通过 RabbitMQ 发送消息? 例如,我想在 30 分钟后使客户端 session 过期,并且我发送了一条将在 30 分钟后处理的消息。 最佳答案 您可以尝试两种方法: 旧方法:在每个
RabbitMQ 在单个服务器上可以处理的最大队列数是多少? 这取决于内存吗?它取决于 erlang 进程吗? 最佳答案 RabbitMQ 代理内部没有任何硬编码限制。代理将利用所有可用资源(除非您对
RabbitMQ Server 使用或需要在防火墙上为节点集群打开哪些端口? 我的 /usr/lib/rabbitmq/bin/rabbitmq-env 设置如下,我假设需要 (35197)。 SER
我是一名优秀的程序员,十分优秀!