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 字段建立了一个在通道(channel)内所有消费者之间共享的限制。我们决定改为将该限制授予通道中的每个消费者个人。
为什么要这样改?** 这使得以更有效的方式实现预取限制变得切实可行。以前,预取限制在单个节点上有明显的性能成本,而在集群中跨消费者使用时则非常糟糕。现在,这两种情况下它几乎是零成本的。
我该怎么做? 您可能根本不在意。大多数消费应用程序每个通道只会有一个消费者,因此这不会产生任何影响。那些在每个通道拥有多个消费者的应用程序,通常也只是以相当近似的方式使用预取限制(即“别把我淹没就行”)。那些需要精确、共享的预取限制的程序,可以开启 basic.qos 的 global 标志来获得旧有的行为,详情请点击此处。
AMQP 对象名称必须为 UTF-8 编码
发生了什么变化? AMQP 的 'shortstr' 数据类型(用于交换机和队列名称、路由键等)在规范中被定义为 UTF-8 格式。RabbitMQ 的旧版本会接受无效的 UTF-8 字节序列。
为什么要这样改? 这在与 HTTP 和 STOMP 等基于文本的协议进行互操作时会导致严重问题,因为这些协议无法处理无效的 UTF-8 字节序列。
我该怎么做? 在命名时使用有效的 UTF-8 序列。我们预计绝大多数用户本来就在这样做。使用无效 UTF-8 字节序列的一个症状是它会破坏管理插件(management plugin)——所以如果这没有困扰到您,那么您肯定不需要做任何事情。
已移除 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(或者直接停止读取 socket)。如果您确实需要能够主动说“停止给我发送消息”,您仍然可以通过取消消费者的订阅,并在准备好继续时重新订阅来实现相同的效果。