oslo.messaging: 移除 RPC 响应的结束消息

https://blueprints.launchpad.net/oslo.messaging?searchtext=remove-double-reply

我们将为 RPC 响应发送单个消息。

问题描述

目前,当我们等待 RPC 响应时,对于每个 msg_id 我们会收到两个 AMQP 消息——第一个带有有效负载,第二个用于确保其他方已完成发送有效负载。这是因为很久以前 ‘reply’ 允许使用生成器作为有效负载来在一个 ‘rpc.call’ 上发送多个消息 - 参见 [1]

Oslo.messaging 不支持将生成器作为有效负载,它发送带有数据的响应,然后发送结束消息,因此为每个调用发送双重 RPC 消息变得毫无用处。基于这些建议,我们将移除第二个 AMQP 消息的发送。

此更改不向后兼容,因此我们必须选择如何处理向后兼容性和弃用。此规范是关于该更改的提议。

提议的变更

此更改不向后兼容,因此我们需要确保存在某种方法来运行服务混合版本,其中版本 N 始终可以与 N+1 通信,反之亦然,以便我们可以执行滚动升级。

滚动升级计划:

在 Kilo 中:

旧行为,与 Liberty 和更早版本完全兼容。

RPC 服务器以两个消息发送响应,可以响应客户端,版本 <= L+1。RPC 客户端期望以两个消息接收响应,可以从版本 <= L 的服务器接收响应。

在 Liberty 中:

我们将实现新的行为,但默认情况下保留旧行为。与 Kilo 和更早版本完全兼容。

我们将更改 ReplyWaiters 以处理一个消息和两个消息的响应,就像它所做的那样 [2]

我们将创建一个布尔配置选项,默认值为 False。如果此选项为 True,我们将以一个消息发送响应,否则我们将保持当前两个消息的行为。此配置选项将允许我们在测试套件中测试这两种行为(旧的和新的),并允许提前启用此新行为。因此,这仅适用于早期采用者和测试。此选项不需要在正常的升级流程中,并且一旦我们默认启用新行为,就必须将其删除,以确保升级到 L+2 的已部署云不会因为云操作员强制执行旧行为而中断。

RPC 服务器以两个消息发送响应,可以响应 <= L+1 RPC 客户端期望以两个消息或一个消息接收响应,可以从所有版本接收响应

在 M 发布周期中:

我们将默认启用新行为,删除配置选项,并仅支持一个消息的响应。这将破坏与 oslo.messaging <= kilo 和 oslo-incubator RPC 遗留代码的向后兼容性。

rpc-server 以一个消息发送响应,可以响应 >= L rpc-client 期望以两个消息或一个消息接收响应,可以从所有版本接收响应

在 N 发布周期中:

我们将删除允许接收来自 <= L 的响应的遗留代码。

rpc-server 以一个消息发送响应,可以响应 >= L+1 rpc-client 期望以一个消息接收响应,可以从 >= L+1 接收响应

备选方案

使用 oslo.messaging 有效负载版本。但这被设计用于消息的内容本身。并非真正用于此目的。并且反序列化发生在 oslo.messaging 的较低层。当处理响应时,版本字段已被删除。

这也会破坏向后兼容性。

我们已经可以跟踪旧格式和新格式,因为旧格式具有属性“result”或“ending”,新格式将具有“result”和“ending”。

请注意,问题在于 RPC 调用响应代码中。在滚动升级的情况下,我们必须考虑客户端将等待可以来自相同或更高版本的 oslo.messaging 的消息。我们已经不支持从应用程序 PoV 的较低版本。

或者从服务器的角度来看,我们将发送必须被广泛版本的理解的响应。

这是我们第一次(我想)遇到这种问题,其他一些错误也需要破坏向后兼容性才能修复。(因为我们需要更改 RabbitMQ 队列属性或将队列移动到另一个交换机)

主要目标是选择向后兼容的版本数量,并在其他类似此更改的更改中使用相同的弃用类型。

Impact on Existing APIs

不适用

安全影响

不适用

性能影响

这将减少在 RabbitMQ/QPID 集群上传输的响应消息数量 2 个。本地性能测试表明,此更改使每秒 RPC call 消息的数量增加了近 30%。

Configuration Impact

一个隐藏的配置选项将允许早期采用者和测试目的切换到未来的行为。

开发人员影响

不适用

Testing Impact

我们必须测试新的 ReplyWaiters 代码是否可以处理来自发送一个消息响应的 oslo.messaging 版本和来自发送两个消息响应的版本。这是一个驱动程序特定的更改,因此我们应该在单元测试中实现它。

实现

负责人

主要负责人

vsergeyev

其他贡献者

sileht

里程碑

完成目标里程碑

Liberty 的第一步,M 或 N 的第二步

工作项

  1. 更改 ReplyWaiters 以处理一个消息和两个消息的响应。

  2. 添加一个配置选项并更改 _send_reply() 方法以允许根据配置选项发送响应和 ending 在单个消息中。

  3. 删除配置选项并默认启用新行为。

  4. 从 ReplyWaiters 中删除 ending 参数处理。

孵化

不适用

文档影响

告知部署者未来与太旧的 oslo.messaging 版本的不兼容性

依赖项

不适用

参考资料

WIP 审查

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode