当前位置: 首页 > 知识库问答 >
问题:

RabbitMQ更改生产系统上的队列参数

商茂勋
2023-03-14

我正在使用RabbitMQ作为面向服务的体系结构中的消息队列,其中许多单独的web服务发布绑定到RabbitMQ队列的消息。这些队列依次由执行后台工作的各种消费者订阅;RabbitMQ的一个非常普通的用例。

现在我想更改一些队列参数(特别是,我想用某个路由键将队列绑定到一个新的死信交换)。我的问题是,由于以下几个原因,在生产系统上进行这种更改是有问题的。

在生产系统中不丢失消息的情况下,转换到这些新队列的最佳方法是什么?

我已经考虑了从版本化队列名称到使用新设置创建一个新的vhost,再到在适当的位置进行所有更改。

不同发布者和消费者基础之间的一般协调(或者,更好的是,一种避免需要协调它们的方法)。

共有1个答案

南宫阳焱
2023-03-14

队列绑定可以在运行时添加和删除,而不会对客户端产生任何影响,除非客户端手动修改绑定。因此,如果您的问题只是关于绑定,只需通过CLI或web管理面板更改它们,并跳过下面所写的内容。

进行反向不兼容的更改是一个常见的问题,特别是在异构环境中,特别是当多个应用程序试图以自己的方式(使用它们的特定设置)声明相同的实体时。要在多个应用程序中同时更改队列声明并不容易,这在很大程度上取决于整个工作过程的组织方式、应用程序的关键程度、基础设施是什么等等。

又快又脏道:

如何在单个VHOST内部将消息从一个队列迁移到另一个队列是一个有点棘手的问题。整个解决方案在单个vhost中工作,但需要为要修改的每个队列提供额外的队列。在源队列上设置死信交换,并将其指向将过期消息路由到新的目标队列。然后将每个队列消息TTL应用到源队列,设置x-message-ttl=0(将其设置为最小值,请参见“完全不排队”有关立即传递的注释)。这两个操作都可以通过CLI或管理面板完成,并且可以在已经声明的队列上完成。这样,您的发布者就可以像往常一样发布消息,甚至旧的使用者也可以第一次按预期工作,但同时,新的使用者也可以从新的队列中使用,新队列可以手动或以其他方式预先声明新的参数。

请注意,对于消息数量大、消息流量大的队列,要满足流量控制限制存在一些风险,特别是如果您的服务器几乎利用了所有的it资源。

更复杂但更安全的方法(适用于整个消息工作流逻辑更改的情况):

更新:

您可能会发现非常有用的铲铲插件,特别是动态铲铲,可以在交换和队列之间移动消息,甚至在不同的vhosts和服务器之间移动消息。这是在队列/交换之间迁移消息的最快和最安全的方法。

 类似资料:
  • 在队列选项卡的rabbitMQ web界面上,我看到了“概述”面板,我在其中找到了以下内容: 排队消息: 准备好了 未确认 总数 我猜“总数”是多少。但什么是“准备就绪”和“未确认”?“准备好了”——传递给消费者的信息?“未确认”-? 消息费率: 发表 交付 重新交付 承认 这些信息是什么?尤其是“重新交付”和“确认”?这是什么意思?

  • 我需要能够更改ThreadPoolExecator的任务队列的大小。当然,BlockingQueue不支持更改大小,ThreadPoolExecitor不支持更改队列。 所以,我想到的方法是使用ThreadPoolExecutor。shutdownNow(),它返回了一个尚未执行的可运行程序列表。然后,我可以创建一个具有所需队列大小的新执行器,并重新提交所有任务。 问题是在shutdownNow(

  • 可以通过多个RabbitMQ集群使用RabbitMQ HA吗? 这是我的要求: 我们有2个RabbitMQ集群(每个集群有4个节点)。两个集群中的所有节点都将使用相同的Erlang cookie。因此,尽管这两个群集在物理上位于不同的位置,但将作为一个包含8个节点的群集。 我们计划使用HAProxy来负载平衡两个集群(8个节点)。发布者和消费者都将使用此代理连接到代理。 我们希望为HA使用镜像队列

  • 本文向大家介绍比较传统队列系统与Apache Kafka相关面试题,主要包含被问及比较传统队列系统与Apache Kafka时的应答技巧和注意事项,需要的朋友参考一下 答:让我们比较一下传统队列系统与Apache Kafka的功能: 消息保留 传统的队列系统 - 它通常从队列末尾处理完成后删除消息。 Apache Kafka中,消息即使在处理后仍然存在。这意味着Kafka中的消息不会因消费者收到消

  • 问题内容: 如何从Java程序外部更改user.home系统属性,使其认为它与D:\ Documents and Settings \%USERNAME%是不同的目录?通过环境变量还是VM参数? 问题答案: 设置VM参数应该起作用: 这是一个测试案例: 在Win XP和Linux上使用Java 1.5.0_17测试

  • 我得到了一份0-100人的球员名单和一份拥有自己所有成员名单的球队名单。 现在我想把球员放在团队中,这样团队的大小基本相同(-1差异是可以的),并且技能的总和应该尽可能接近。 我目前的解决方案是一个简单的投票算法(团队在圆圈中投票球员,然后选出下一个最佳球员): 问题是,给出的不是最均匀的团队,控制台输出是: 球队1:球员4,技能75;玩家 3, 技能 50 第二队:球员2,技能50;球员1,技能