RabbitMQ 3.0 中的破坏性变更
RabbitMQ 包含了许多很酷的新特性。但为了实现其中一些特性,我们需要更改一些内容。因此,在这篇博文中,我将列出其中的一些内容,以防您需要对它们进行任何操作。
镜像队列策略
发生了什么变化?在 RabbitMQ 3.0 中,队列镜像不再由声明队列时的 x-ha-policy
参数控制。您的应用程序可以继续声明此参数,但它不会导致队列被镜像。相反,您可以声明一个或多个策略,这些策略控制哪些队列被镜像以及如何镜像。
为什么改变?任何使用过镜像队列的人都会告诉你,要求应用程序知道哪些队列被镜像是一件很痛苦的事情。新方法将配置放在代理中,它应该在代理中,并且还支持随时更改镜像策略。
我应该怎么做?您需要确保您的队列仍然被镜像。有关完整文档,请参阅此处,但如果您只想确保所有队列(除了具有自动生成名称的队列)都跨所有节点镜像,请运行
rabbitmqctl set_policy HA '^(?!amq\\.).*' '{"ha-mode": "all"}'
新的联合
发生了什么变化?在 RabbitMQ 3.0 中,联合的配置方式完全不同。x-federation
交换类型不再存在;相反,普通交换机通过策略以与 HA 队列相同的方式被设置为联合。此外,上游也以动态方式定义。
为什么改变?同样,您的应用程序不应该需要了解联合。rabbitmq.config
中的联合配置很复杂,并且让许多人感到困惑。并且需要重新启动代理才能添加新的上游并不是一件有趣的事情。
但是我已经有一个正常运行的联合设置了!你把它搞坏了。迁移到新的联合方式需要一些工作。在此期间,您可以使用 rabbitmq_old_federation
插件。这是 RabbitMQ 3.0 的 2.8.7 联合插件的反向移植。要使用它
rabbitmq-plugins disable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_old_federation
然后编辑您的 rabbitmq.config
文件,以便将 rabbitmq_federation
部分重命名为 rabbitmq_old_federation
。
新的集群
发生了什么变化?rabbitmqctl 中的集群设置命令已更改。
为什么改变?旧的命令不太友好。
我需要做什么?如果您有现有集群,则无需执行任何操作。如果您编写脚本以创建集群,则需要编辑它们。特别是,rabbitmqctl cluster
应替换为 rabbitmqctl join_cluster
,但是
- 您不需要先调用
rabbitmqctl reset
- 您不需要在命令行上列出所有节点;如果您提供多个节点,则它们将被视为要尝试与之集群的节点列表。
- 新节点是磁盘节点还是 RAM 节点由 --disc 和 --ram 标志决定。默认情况下为磁盘节点。
有关更多详细信息,请参阅文档。
删除“immediate”标志
发生了什么变化?我们删除了对 AMQP 的 basic.publish 上很少使用的“immediate”标志的支持。
你为什么要这么做?对“immediate”的支持使代码库的许多部分变得更加复杂,尤其是在镜像队列周围。它也阻碍了我们能够在镜像队列中实现实质性的性能改进。
我需要做什么?如果您只想能够发布如果未立即使用就会被丢弃的消息,您可以发布到具有 0 TTL 的队列。
如果您还需要发布者能够确定这种情况是否发生,您还可以使用DLX功能将此类消息路由到另一个队列,发布者可以从中使用这些消息。
frame_max
发生了什么变化?RabbitMQ 服务器现在会断开发送大于连接协商的 frame_max
设置的帧的客户端的连接。
为什么改变?恶意(或编写不当的)客户端可以发送任意大的帧并导致服务器内存不足。
我为什么要关心?不幸的是,一些客户端没有正确实现 AMQP 帧。RabbitMQ 3.0 将允许客户端超出 frame_max
一些字节的容差(以允许出现一位错误以及错误地排除帧头),但是如果您的客户端帧出现问题,则在尝试发送大于 frame_max
的消息后将断开连接(默认情况下为 128kb;请参阅文档,了解如何提高此值)。
管理和 JSON-RPC 通道端口更改
发生了什么变化?管理插件现在侦听端口 15672,而不是 55672。JSON-RPC 通道现在侦听 15670,而不是 55670。
为什么改变?旧端口在许多操作系统的短暂端口范围内,这意味着 Web 浏览器和其他客户端应用程序可能会任意使用这些端口。您不应该在这些端口上侦听。
特别是,我们注意到管理插件 Web UI 当指向本地主机上的已停止代理时,最终会导致浏览器在端口 55672 上连接到自身。这阻止了代理重新启动。
我必须做什么?希望什么都不用做。RabbitMQ 将尝试打开旧端口并将 HTTP 重定向发送到新端口。但是,如果您使用的是 Web 浏览器以外的应用程序与 HTTP API 通信,则它可能不支持 HTTP 重定向。如果它不支持,您需要将其指向新端口。
请注意,3.0 之前的 rabbitmqadmin
就是这样的应用程序。糟糕。
另请注意,STOMP 插件仍在端口 61313 上侦听。尽管这在短暂范围内,但它是 STOMP 最接近标准端口的东西,因此我们必须坚持使用它。
expiration 属性
发生了什么变化?现在,如果设置了消息属性中的 expiration 字段,我们期望它可以解析为整数。
为什么改变?为了支持每条消息的 TTL,我们需要一个地方来获取消息的 TTL,而这是显而易见的地方。不幸的是,AMQP 标准将其定义为字符串,因此我们尝试将其解析为整数,如果它不是整数,则会抛出通道异常。
我必须做什么?确保如果您正在使用该属性,那么您是在使用它因为您希望 RabbitMQ 使消息过期,并确保将其设置为可解析为整数的字符串。