将 ZeroMQ 驱动的基础模式更改为 REQ/REP

https://blueprints.launchpad.net/oslo.messaging/+spec/zmq-req-rep

由于最近提出了许多更改(不仅仅是模式替换),本规范实际上建议提供 ZeroMQ 驱动的并行实现(zmqv2)。 推荐的基础模式是 REQ/REP + ROUTER/DEALER,这将简化驱动程序的实现并提高其可靠性。 实现后,将有可能比较这两种实现。

旧版 zmq 驱动的关键优势在于其向后兼容性以及与旧版本 ZeroMQ 库的兼容性(在进行一些修复后)。

问题描述

目前 ZeroMQ 驱动实际上实现了请求-回复模式,但它是基于更原始且不太可靠的 PUSH/PULL 实现的。

主要缺点是 PUSH/PULL 没有反向连接来回复发送者。 我们单向发送消息并忘记。 如果我们想收到回复,我们需要建立另一个连接。 在当前的驱动程序实现中,它是通过 PUB/SUB 完成的。 这导致需要为另一个套接字连接管道提供服务。 更多代码才能使事情正常工作。 连接失败的可能性更高。

更改为 REQ/REP 的主要原因是它“开箱即用”地完成了所有事情。

提议的变更

当前的 ZeroMQ 驱动程序实现使用跨服务 zmq_receiver 守护程序作为代理,以便每个节点只有一个 TCP 连接(端口)。 所有消息都到达 TCP 连接,然后通过 IPC 在服务之间传播。 新版本将坚持这种总体架构。

因此,我们有三个部分需要连接

rpc_client (REQ) <=> (ROUTER) zmq_receiver (DEALER) <=> (REP) rpc_server

这足以满足 CALL 方法的要求。

REQ/REP 套接字的优点是它实现了状态机来管理请求/回复,并且在套接字处于“等待回复”状态时发送请求会引发异常。 因此,它理想地匹配 CALL 要求,该要求应阻塞等待回复。

但这对于 CAST 来说很糟糕。 在这里,我们可以用 DEALER 替换 REQ,它是 REQ 的异步等效项。 当我们使用 DEALER 时,我们不需要等待回复,但我们仍然可以接收回复。 我们甚至不需要忽略它们,而是将其用作确认信号,表明 CAST 消息已成功传递。 我们还可以跟踪未确认的消息并在需要时报告它们。 因此,在此步骤中,我们可以看到 REQ/REP 的可靠性高于 PUSH/PULL。 在使用 DEALER 时,REQ 信封需要进行一些操作,但这没有问题,并且在 zmq-guide 中有明确说明。

因此,CAST 的链将如下所示

rpc_client (DEALER) <=> (ROUTER) zmq_receiver (DEALER) <=> (REP) rpc_server

DEALER 也非常适合具有扇出的 CAST。 消息链保持不变。 同样适用于通知程序。

规则很简单:如果我们需要阻塞等待请求,则使用 REQ,否则使用 DEALER 发送异步请求。 ROUTER 是 REP 的异步替代品。

由于我们讨论的是新的驱动程序实现,因此值得一提的是,匹配扇出主题、消息格式、代理守护程序将保留,但会进行重构。 我们将解决诸如 [1][2][3][4][5] 也应在此处应用,但作为优化,在实现完成后。

配置选项和消息传递 API 不应更改,因此我们可以轻松地在 devstack(以及任何其他部署)中使用新的驱动程序代替当前的驱动程序。

备选方案

也可以在当前实现中替换模式。

Impact on Existing APIs

无。

安全影响

无。

性能影响

连接数将减少,因此可能会提高性能。

Configuration Impact

无。

开发人员影响

更少的代码来支持回复。

Testing Impact

现有的功能测试应涵盖此更改。

实现

负责人

主要负责人

ozamiatin

里程碑

完成目标里程碑:liberty-3

工作项

  • 实现 CALL 管道和周围的模块
    • 根据 [1] 的包层次结构

    • 将消息序列化、主题操作等从现有实现移动到适当的模块

    • rpc_client 部分

    • broker_part

    • rpc_server 部分

    • 回复处理

  • 实现 CAST

  • 实现扇出

  • 实现通知程序

孵化

无。

采用

无。

oslo.messaging。

预计 API 稳定

无。

文档影响

无。

依赖项

无。

参考资料

注意

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