RabbitMQ 3.3 的重大变更
什么?又一篇 “重大变更” 文章?是的,但希望这次比上次更容易处理。但是 RabbitMQ 3.3.0 中有足够多的轻微不兼容的更改,值得在此处列出。
“guest” 用户只能通过 localhost 连接
发生了什么变化? 在以前的版本中,默认的 guest 用户可以从任何网络位置连接。在 RabbitMQ 3.3.0 中,它只能通过 localhost 连接。
为什么会发生变化? 具有众所周知的凭据且网络可访问的默认用户并非绝对安全。
我应该怎么办? 为您的应用程序创建不同的用户,而不是使用“guest”。如果您无法轻松做到这一点,请参阅此处 了解如何重新启用通过网络对“guest”用户的访问。
basic.qos 语义已更改
发生了什么变化? 在 AMQP 标准中,prefetch-count
字段建立了一个限制,该限制将在通道中的所有消费者之间共享。我们已决定改为将该限制单独授予通道中的每个消费者。
为什么会发生变化? 这使得以更有效的方式实施预取限制变得切实可行。预取限制曾经在单个节点上具有明显的性能成本,并且在跨集群消费时具有相当糟糕的性能成本。现在,这两种情况下基本上都是免费的。
我应该怎么办? 可能您不在意。大多数消费应用程序每个通道只有一个消费者,因此这不会有任何区别。那些每个通道有多个消费者的应用程序可能会以相当粗略的方式使用预取限制(即“只是不要淹没我”)。那些需要精确的、共享的预取限制的应用程序可以打开 basic.qos
global
标志以获得旧的行为,请参阅此处 了解详细信息。
AMQP 对象名称必须是 UTF-8
发生了什么变化? AMQP 'shortstr' 数据类型(用于交换机和队列名称、路由键等)在规范中被定义为 UTF-8 格式。以前版本的 RabbitMQ 会接受无效的 UTF-8 字节序列。
为什么会发生变化? 这给与基于文本的协议(如 HTTP 和 STOMP)的互操作性带来了麻烦,这些协议不能只是将无效的 UTF-8 字节序列放入其中。
我应该怎么办? 在命名事物时使用有效的 UTF-8 序列。我们期望几乎所有人都在这样做。使用无效 UTF-8 字节序列的一个症状是它破坏了管理插件 - 因此,如果您的管理插件没有损坏,那么您肯定不必做任何事情。
移除了 Impersonator 标签
发生了什么变化? RabbitMQ 3.0.0 引入了一个“impersonator”标签,允许您授予用户伪造 validated user-id 字段的能力。
为什么会发生变化? 这实际上是 federation 插件的一个内部实现细节,它泄露到了外部,因此现在 federation 插件不再需要它,它将被移除。
我应该怎么办? 如果您对此功能有合理的用例,请告诉我们。
更新:impersonator 标签已在 RabbitMQ 3.3.1 中恢复。
移除了 JSON-RPC 插件
发生了什么变化? JSON-RPC 插件不再与服务器捆绑在一起。
为什么会发生变化? 该插件已经很久没有维护了。它的架构不是很好。
我应该怎么办? 如果您仍然需要该插件,可以暂时从 mercurial 构建它。将来我们希望为非核心插件提供更轻松的安装体验。 更新:请参阅社区插件页面以下载 JSON-RPC 插件。
移除了客户端发送的 channel.flow 支持
发生了什么变化? 在以前版本的 RabbitMQ 中,消费客户端能够发送 channel.flow{active=false}
来告诉服务器暂时停止发送消息。此功能已被移除。
为什么会发生变化? 很久以前,我们确定 channel.flow
在流量控制方面表现不佳,因此在 2.0.0 中停止从服务器向客户端发送它。
它表现不佳,因为当您想停止接收消息时,您希望立即停止,而不是向对等方发送请求并希望它快速处理它。因此,我们怀疑是否有人真的在使用它,而且它使代码变得更加复杂。
我应该怎么办? 有更好的方法可以阻止服务器用消息淹没您的消费者。使用 basic.qos
(或只是停止从套接字读取)。如果您确实想要主动说“停止向我发送消息”的能力,您仍然可以通过取消您的消费者并在您准备好继续时重新消费来获得相同的效果。