Zaqar/specs/havana
注意:此页面已过时。请在此处查看 Marconi 项目的最新信息:Marconi
目录
Marconi:OpenStack 的云消息队列
注意:此页面已过时。请在此处查看 Marconi 项目的最新信息:[Marconi]
本规范正式化了在 Grizzly Summit 工作会议期间捕获的需求和设计考虑,旨在启动 OpenStack 的消息总线项目。OpenStack。随着项目的发展,其需求也会随之变化,因此本规范仅作为起点。
以下是 Marconi 工作方式的简要概述
- 客户端通过 HTTP 将消息发布到 Marconi。URL 包含租户 ID。
- Marconi 根据默认 TTL 或客户端指定的 TTL 持久化消息。
- 客户端轮询 Marconi 以获取消息。
- 客户端可以选择性地声明一批消息,将其隐藏在其他客户端面前。一旦客户端处理完每条消息,就可以将其从服务器删除。这样,Marconi 提供了一种机制来确保每条消息只被处理一次。
原理
缺乏集成的云消息总线服务是 OpenStack 采用的主要障碍。虽然 Amazon 具有 SQS 和 SNS,但 OpenStack 目前没有提供替代方案。
OpenStack 需要一个多租户消息总线,该消息总线快速、高效、持久、水平可扩展且可靠。
Marconi 项目将满足这些需求,作为 OpenStack 现有 RPC 基础设施的补充,同时提供可以暴露给在公共和私有云上运行的应用程序的多租户服务。
用例
注意:此数据已过时。请在此处查看最新的用例信息:Use Cases (Marconi)
1. 在多个工作者之间分发任务(事务性作业队列)
2. 将事件转发给数据收集器(事务性事件队列)
3. 将事件发布给任意数量的订阅者(发布/订阅)
4. 将命令发送到一个或多个代理(通过点对点或发布/订阅的 RPC)
5. 从代理处请求信息(通过点对点的 RPC)
6. 监控 Marconi 部署(DevOps)
设计目标
Marconi 的设计理念源自 Donald A. Norman 关于日常事物的设计的研究
The value of a well-designed object is when it has such a rich set of affordances that the people who use it can do things with it that the designer never imagined.
与上述相关的目标
- 涌现的功能,实用性
- 模块化、可插拔的代码库
- REST 架构风格
要坚持的原则
- DRY
- YAGNI
- KISS
主要特性
注意:此页面已过时。请在此处查看 Marconi 项目的最新信息:Marconi
非功能性
- 版本化的 API
- 多租户
- 使用 Python 实现,遵循 PEP 8 和 Pythonic 惯例
- 模块化、基于驱动程序的架构
- 异步 I/O
- 客户端无关
- 低响应时间,即使在高负载下也能在 20-50 毫秒(或更短)内处理请求
- 高吞吐量,使用小型集群提供数百万个请求/分钟
- 每个队列数千个请求/秒(?)
- 每个租户数十万个队列
- 读写的水平扩展
- 支持 HA 部署
- 保证传递
- 尽力而为的消息排序
- 服务器生成所有 ID
- Gzip'd HTTP 主体
- 安全(经过审计的代码、端到端 HTTPS 支持、渗透测试等)
- 模式验证
- Auth 缓存
功能性
- 事件和工作队列语义
- JSON
- 不透明的有效载荷(任意 JSON 或 base64 编码的二进制数据)
- 最大有效载荷大小为 4K
- 批量消息发布和查询
- Keystone auth 驱动程序(服务目录可以返回不同区域和/或不同特征的端点)
未来特性(头脑风暴)
TODO:为这些创建蓝图,确定优先级
头脑风暴的特性,顺序不分先后
- LZ4 压缩用于静态消息
- 多传输(Http, ZMQ)
- SQLAlchemy 驱动程序
- REPL 用于调试、测试、诊断
- Python、PHP、Java 和 C# 的客户端库
- 自动生成的审计河(只读队列),用于操作和状态更改
- 延迟传递
- 热重构
- PATCH 支持用于更新队列元数据
- 设置/获取任意队列元数据
- Kombu 集成
- 与特定应用程序和特定队列绑定的 API 令牌,OAuth?
- 消息签名
- 独立的控制面板或至少是一个简单的管理/仪表板应用程序,供运维人员使用
- JSON-P 或 CORS 支持(可能需要使用 while(1); 技巧来防止 XSS 攻击)
- 多获取(指定要在一个请求中查询的队列列表)
- 基于标签的过滤
- 包括一种以一种调用返回所有带有或不带有标签的内容(OR 语义)的方式,以实现扇出。
- XML 支持
- LZ4 或 snappy 主体压缩(静态,以及 WSGI 服务器和客户端库中)
- 响应缓存
- 授权(基于标签和/或队列)
- 跨租户共享(需要定义业务案例)
- 时间查询
- JavaScript 客户端库(浏览器和 Node.js)
- Ruby 客户端库
- PHP 客户端库
- 跨区域复制
- Horizon 插件
- Ceilometer 数据提供程序
- PyPy 支持
- HTTP 2.0 支持
- 长轮询
- Web Socket 传输驱动程序
- Web 钩子
非特性
Marconi 可用于支持提供以下功能的其他服务,但不会直接在其代码库中嵌入这些功能。
- 任何通过持久连接的推送通知(导致复杂的状态管理和较差的硬件利用率)
- 将通知转发给电子邮件、短信、Twitter 等(ala SNS)
- 将通知转发给 Web 钩子
- 将通知转发给 APNS、GCM 等
- 按需调度服务(ala IronWorker)
- 计量和监控解决方案
架构
注意:此页面已过时。请在此处查看 Marconi 项目的最新信息:Marconi
Marconi 将使用微内核架构。Auth、传输、存储、缓存、日志记录、监控等都将实现为驱动程序或通过标准协议公开,允许供应商自定义 Marconi 以满足其需求。
端点控制器定义了存储和传输之间的接口。更多信息。
可以帮助实现高度模块化设计的可能框架
- pkg_resources
- stevedore
参考驱动程序
- 传输:HTTP(S) 通过 WSGI 使用 Falcon
- Auth:Keystone 中间件
- 存储:MongoDB
- 日志记录:标准库日志记录
- 监控:TBD - Statsd,以及 HTTP 统计页面?
部署选项
- 通过 gevent.http 或 ZMQ 自行托管
- 使用 WSGI 服务器托管。
- 需要编写一个小的引导脚本来加载内核并导出应用程序可调用对象。
- 引导脚本还允许对日志记录进行完全的编程自定义
API
请参阅 Marconi API 规范。[粗略草案]
测试计划
所有开发都将以 TDD 风格进行,使用 nose 和 testtools。配对编程可能会偶然发生(甚至可能是故意的)。最终我们将添加集成、性能和安全测试,并将所有内容自动化到一个整洁的 CI 管道中。