Redis 存储驱动设计 (Zaqar)
目录
目标
Redis 是一个内存键值数据存储,可以以字符串、哈希、列表、集合、有序集合、位图和超对数等方式组织数据。基于内存的特性使其成为高负载、低延迟消息的理想选择。Redis 在 BSD 许可下发布,因此不受 MongoDB 等案例中的任何许可限制。
用例
1. 高吞吐量(每个队列 2K+ 消息/秒)
2. 大量小消息(<= 1K)
3. 消息的生命周期短(分钟,而不是小时)
4. 高持久性是可选的(2 份副本,仅内存)
5. 高可用性仍然非常重要
基本驱动程序的组件
基本驱动程序包括对单个实例 Redis 存储作为数据后端的支持。
该驱动程序支持 marconi 存储驱动程序所需的 6 个主要函数,分别是
消息控制器
帮助组织每个队列范围内的消息。
数据组织
消息 ID 列表 (Redis 有序集合)
系统中的每个队列都有一组当前在队列中的消息 ID。该列表根据一个排名进行排序,该排名使用也存储在每个队列数据库中的计数器 (MESSAGE_RANK_COUNTER_SUFFIX) 以原子方式递增。
消息 (Redis 哈希)
每个消息都使用消息的 UUID 作为 Redis 键进行存储。数据结构包含以下信息。
注意:此数据结构使用 msgpack 进行序列化。
| 姓名 | 字段 |
|---|---|
| id | id |
| 创建 iso | cr_iso |
| ttl | t |
| 过期时间 | e |
| 消息体 | b |
| 声明 | c |
| 声明过期时间 | c.e |
| 客户端 UUID | u |
| 创建时间 | cr |
队列控制器
队列按项目划分范围,项目前缀附加到队列名称。
数据组织
队列 (Redis 有序集合)
ID:queues_set
| 姓名 | 字段 |
|---|---|
| name | <project-id.queue-name> |
该集合有助于更快的存在性检查,而该列表有助于队列的分页检索。
队列信息 (Redis 哈希)
此数据结构包含有关队列的所有元信息。
范围:<project-id_q-name>
| 姓名 | 字段 |
|---|---|
| 计数(大小) | c |
| 已声明 | cl |
| 元数据 | m |
| 创建时间 | t |
声明控制器
数据组织
声明列表 (Redis 集合)
包含队列的活动声明 ID。
Redis ID:<project-id_q-name>
声明信息 (Redis 哈希)
包含特定声明的元数据信息。
| 姓名 | 字段 |
|---|---|
| ttl | t |
| 宽限期 | g |
| id | if |
| 声明 | c |
| 客户端 UUID | u |
目录控制器
待定
池控制器
待定
当前状态
基本驱动程序是一个“正在进行中的工作”,预计将在 Juno-3 截止日期(2014 年 9 月 4 日)之前成为代码库的一部分。预计在 Kilo 结束之前开发集群和持久性扩展。这也是 Marconi 毕业的要求之一。
Blueprints
| 蓝图 URL | 功能性 |
|---|---|
| [1] | Redis 作为 MongoDB 的替代驱动程序 |
| [2] | Marconi 的 Redis 存储驱动程序 |
提交的补丁
| パッチ URL | 已实现的功能 |
|---|---|
| [3] | 消息和队列控制器 |
| [4] | 声明控制器 |
| [5] | 池和目录控制器 |
未来工作
1. 支持与 Redis 数据库的异步连接。