业界消息总线技术分析-Disque
1、概述
n官方简介:
Disque是一款内存是分布式队列,它由redis的作者开发,目前还处于rc版本阶段,具有以下特点:
n 简单易用
n 性能出众,队列的JOB都存储在内存中
n 支持可靠的JOB传递,包括至少接收1次和最多接收1次
n 支持消息轨迹查询
n 消息可以常驻内存,最长数年
2、分布式模型—整体
nServer
Ø 集群部署、无状态、节点间相互有通信
Ø 单个节点也是集群模式,加入集群使用cluster meet命令
Ø 单个节点故障,不影响其他节点 提供服务
Ø Server内存大小影响job的数量和存储时间
Ø job队列是全局一致的
nClient
Ø 不区分消费者和生产者,一个client既可以消费也可以生产
Ø client可以和任意一个server相连
Ø job的生成是事务性的,保证集群中会有所需数量的副本
Ø 消费job需要进行确认
2.1生产者模型
n队列
Ø 队列可以在一台Server上,也可以在多台不同Server上。
Ø 队列里面的job不是都在相同的server节点上。
n特点
Ø celint发送请求,server进行全量复制,随机复制(同步/异步)到可达的serer节点上。
Ø 单个server宕机后,其他server上的副本可以供继续消费
Ø job常驻内存,但是可以进行持久化
Ø 每个job都有一个id,生产者可以查询该job是否被处理了
n发送job方式
Ø 通过redis的私有交互协议,走TCP通道。
Ø 不同的job可以带不同的参数,如延迟发送、生存时间副本数量、重发时间等等
2.2消费者模型
n特点
Ø client可以连接任意一个server去消费多个指定队列的job,消费完成后job依旧存在,除非ackjob
Ø 如果不ACKjob,job可以被多次处理也可能被重复处理,直到TTL时间到了
Ø 如果job不在当前节点,则需要去其他node拉取job
Ø 没有offset
3 网络模型
n 套用redis的网络模型
Ø 基于事件驱动(Event-driven)构建服务。
Ø 自己实现了事件驱动库
Ø 可以多平台使用,性能强劲
nDisque网络相关源码:
ae.h、ae.c : event library具体实现
networking.c : 与客户端的交互
anet.h anet.c : 网络通信
ae_epoll.c ae_select.c ae_kqueue.c : 不同系统多路IO封装
ae_epoll.c : linux平台
ae_select.c : unix平台
ae_kqueue.c : BSD、APPLE
nLinux下多路IO封装:
aeApiCreate: 创建句柄(epoll_create)
aeApiFree: 关闭句柄(close)
aeApiAddEvent:事件添加(epoll_ctl)
aeApiDelEvent: 事件删除(epoll_ctl)
aeApiPoll: 等待事件发生(epoll_wait)
4 消息模型
4.1消息转发流程
①:client向server端发送job
②:server端收到job后向其他节点复制job
③:client连接server端消费job
④:如果当前server端没有要消费的job,就从其他节点获取job
⑤:client连接server并ack job
⑥:server端给job的其他副本所在的节点设置ack
⑦:server端删除已ack成功的job,并通知其他节点也删除
4.2 消息投递可靠性
nAt least Once
支持,retry不为0,TTL为-1,消费后,需要确认;确认ack完成后,job才删除,如果不ack,
job会在retry时间间隔后再次发送到队列中;这样保证每个job只是被处理一次。
nAt most Once
支持,job的retry为0,且replication为1
4.3持久化
n 持久化方式
Ø Disque使用了类似Redis的持久化的方式,AOF(Append Only File),即每次队列中有数据插入,都将写入aof文件。这样,当Disque重启时,再从aof文件重新恢复队列数据。
n 注意
Ø job持久化是使用redis的aof持久化方式。
Ø 默认关闭AOF持久化
Ø AOF文件刷新频率可以配置。
Ø 不是严格意义上的持久化,已ack的消息不会写入aof文件中
5 消息QoS
n 可靠性
job可以有多个副本,存放在不同的server上,只要有一个副本正常,就可以提供服务,job常驻内存,可以使用aof文件进行持久化
n安全
基于TCP的私有通信协议,可以在一定程度上保证安全
n时间约束
Job从产生→复制备份→消费→ack→delete
n消息传递的优先级
尽量提供FIFO的job队列,以job产生的时间来排序。Job重新入队列或者因负载均衡而移到其他server时,job会乱序
6 扩展性
n扩容
扩容非常方便,新节点可以直接加入集群中
n缩容
删除节点可以实现缩容,但首先要保证删除节点上的job都有备份或者已被消费完毕。
n升级
目前是rc版本,应该是向后兼容的
7总结
集群部署简单
消息不落地,速度快,但是也有aof文件来保证持久化,可以灵活控制
无法保证消息有序
消息堆积量受限于集群的内存
分布式协议为gossip协议
仅支持简单的loadbalance
支持至少一次和至多一次的消息投递
提供细粒度的消息控制,如retry、TTL、replication、delay
server是单线程的,使用epool事件驱动,后面据说会修改成多线程
消息可以追踪,就是消费者和生产者都可以通过命令查看队列中的消息
消息投递支持事物,但消息消费不支持
参考:https://github.com/antirez/disque
- 点赞
- 收藏
- 关注作者
评论(0)