Breaking things with RabbitMQ 3.3
什么?又一篇 “Breaking things” 的文章?是的,但希望这次比上次要容易处理得多。但 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 (或者直接停止从套接字读取)。如果您确实需要主动说“停止向我发送消息”的功能,您仍然可以通过取消您的一个或多个消费者,然后在准备继续时重新消费来实现相同效果。