持久化传输

持久连接允许单个 TCP 连接发送和接收多个请求/响应,而不是为每对请求/响应打开一个新的 TCP 连接。当应用程序打开更少的 TCP 连接并保持它们更长时间的开启状态时,会导致更少的网络流量,减少建立新连接的时间,并允许 TCP 协议更有效地工作。

目前 Zaqar 支持非持久化传输,忽略了一些可以通过更高效和可靠的持久化传输解决方案覆盖的使用场景。

以下是一些将受益于此更改的使用场景:

  • 与浏览器的通信:WebSockets 将增强浏览器和 Zaqar 之间的通信,这是 Zaqar 与 OpenStack Dashboard (Horizon) 集成的关键因素。

  • 通知:这种类型的传输将构成更好的通知协议,这也是 Kilo 版本计划中的一项功能。

https://blueprints.launchpad.net/zaqar/+spec/persistent-transport

问题描述

目前 Zaqar 中无法建立持久连接。此规范建议通过 Websockets 实现来添加此功能。

提议的变更

如前几节所述,建议的更改是为 Zaqar 添加持久化传输的替代方案。这可以通过使用 websockets 来实现。

Websockets 提供在单个 socket 上运行的全双工通信通道,这将消除开销并显著降低复杂性。

目前 Zaqar 中的传输层与 WSGI 传输紧密绑定,这使得添加此功能成为一项复杂的任务。

回退

如果 WebSockets 不可用,客户端将回退到短轮询 REST API。

WebSockets 不可用的原因包括:

  • 防火墙可以配置为在一定时间后终止 HTTP 连接。

  • 出于安全考虑,任何非 HTTP 流量(端口 80 或 443)都可能被终止。

消息序列化

为了传输数据,需要一种序列化技术。有几种替代方案,包括 MsgPack、Protobuf、Apache Avro 和 Cap’n Proto。

考虑到浏览器兼容性是首要任务,MsgPack 是这些方案中的最佳选择。其余替代方案没有开箱即用的 Javascript 支持,使得确保与大多数 Web 应用程序的兼容性更加困难。

备选方案

  • 建立持久连接,启用 WSGI keep-alive

  • 长轮询

实现

负责人

主要负责人:vkmc

次要负责人:cpallares

里程碑

完成目标里程碑:< K-1

工作项

  • 实现公共 API 层

  • 定义持久化传输的线路协议

  • 实现驱动程序

  • 实现队列和消息控制器

  • 实现声明控制器

  • 实现池、风味和统计控制器

WebSocket 库

在讨论了几种替代方案,包括 SockJS、SocketIO、Autobahn、ws4py 和 Tornado 之后,已决定使用 ws4py 来实现此功能。有关此决定的更多详细信息,请参见 WebSockets wiki

依赖项

注意

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