- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在RabbitMQ specification可以找到:
Section 4.7 of the AMQP 0-9-1 core specification explains the conditions under which ordering is guaranteed: messages published in one channel, passing through one exchange and one queue and one outgoing channel will be received in the same order that they were sent. RabbitMQ offers stronger guarantees since release 2.7.0.
但是如果有像 Exchange 1 -> Exchange 2 -> Queue 1
这样的绑定(bind)呢?
仍然保证顺序吗?
我们假设是这样,但我们在我们的应用程序中发现情况可能并非如此。我们使用 spring-rabbit-2.1.6-RELEASE
(它使用 amqp-client-5.4.3
)。
发布者、绑定(bind)和消费者如下:
Client 1 publishes to Exchange 1 -> Exchange 2 -> Queue 1 - consumed by Client 2
-> Queue 2 - consumed by Client 3
我们可以看到 Client 1
按以下顺序发布了 3 条消息:
消息 1
消息 2
消息 3
但是Client 2和Client 3都按以下顺序接收消息:
消息 3
消息 1
消息 2
对于发布者(Client 1
),使用了以下 XML 配置(没有在 rabbit 的 ConnectionFactory
上设置额外的属性):
<rabbit:connection-factory channel-cache-size="1" cache-mode="CHANNEL" id="respConnFactory" addresses="..." virtual-host="..." username="..." password="..." executor="connExec"/>
<!-- the executor has no meaning for such usingas mentioned by Gary -->
发布是通过:
AmqpTemplate::send(String exchange, String routingKey, Message message)
在专用线程中。
客户端 2
使用带有 SimpleMessageListenerContainer
的默认 spring 配置。
Client 3
实际上不是我们的应用程序,所以我不知道真正的设置。正是他们向我们报告了一个消息未正确排序的错误。
当然,我们记录的消息发布仍有可能存在一些错误。但我对它进行了三次检查 - 它来自单个线程,并且每条消息的自定义 header 中都有序列号,该序列号在 Client 1
上正确递增。
我做了进一步分析,以了解错误邮件排序发生的频率。这是结果:
我在事件前后 +-2 小时(总共 4 小时)记录了日志和数据,发送了 42706 条消息,其中只有 3 条排序错误在 客户端 2
上。所有 3 条消息都在 7 毫秒的间隔内发送。
然后我随机取另一个长度为14小时的时间窗。 发送了 531904 条消息,所有这些消息都由客户端 2
以正确的顺序接收。平均消息速率约为每秒 11 条消息。
消息分布不均,因此 7 毫秒内的 3 条消息没什么特别的 - 恰恰相反。通常在 3-5 毫秒内发送多条消息。
根据这个分析,我假设 rabbit 集群上发生了一些奇怪的事情。不幸的是,我没有它的日志了。
在我看来,某种竞争条件的可能性非常低。
谢谢,
弗兰克
最佳答案
Spring AMQP 使用 channel 缓存;在多线程环境中,不能保证同一个线程总是使用同一个 channel ;因此不能保证订购。
对于当前版本,解决方案是使用 scoped operations这将保证一系列出版物将在同一 channel 和保证顺序上发生。
在下一个版本(2.3,今年晚些时候可用)中,我们还添加了 ThreadChannelConnectionFactory它做同样的事情。
关于java - RabbitMQ 主题交换消息排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62592526/
我想读取 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
我是一名优秀的程序员,十分优秀!