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 字节序列的一个症状是管理插件会崩溃,所以如果你的管理插件没有崩溃,你就不需要做任何事情。
模拟标签已移除
发生了什么变化? RabbitMQ 3.0.0 引入了 "模拟" 标签,允许你赋予用户伪造已验证用户 ID 字段的能力。
为什么改变了? 这实际上是联邦插件的内部实现细节,它逃逸到了外部,所以现在联邦插件不需要它了,它就被移除了。
我应该怎么做? 如果你对该功能有合理的用例,请告诉我们。
更新:模拟标签在 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
(或只是停止从套接字读取)。如果你确实想要主动说 "停止向我发送消息",你可以通过取消你的消费者并准备好后重新消费来获得相同的效果。