跳转到: 导航, 搜索

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 数据库的异步连接。