业界消息总线技术分析-Disque

举报
步步清风 发表于 2018/01/03 19:44:54 2018/01/03
【摘要】 1、概述n官方简介: Disque是一款内存是分布式队列,它由redis的作者开发,目前还处于rc版本阶段,具有以下特点:n 简单易用 n 性能出众,队列的JOB都存储在内存中n 支持可靠的JOB传递,包括至少接收1次和最多接收1次 n 支持消息轨迹查询 n 消息可以常驻内存,最长数年2、分布式模型—整体nServer Ø 集群部署、无状态、节点间相互有通信 Ø 单个节点也是集群模式,加入集群

1、概述

n官方简介

 Disque是一款内存是分布式队列它由redis的作者开发,目前还处于rc版本阶段,具有以下特点:

n 简单易用 

n 性能出众,队列的JOB都存储在内存中

n 支持可靠的JOB传递,包括至少接收1次和最多接收1 

n 支持消息轨迹查询 

n 消息可以常驻内存,最长数年

2、分布式模型—整体

image.png

nServer 

Ø  集群部署、无状态、节点间相互有通信 

Ø  单个节点也是集群模式,加入集群使用cluster meet命令

Ø  单个节点故障,不影响其他节点 提供服务 

Ø  Server内存大小影响job的数量和存储时间 

Ø  job队列是全局一致的 


nClient 

Ø  不区分消费者和生产者,一个client既可以消费也可以生产

Ø  client可以和任意一个server相连 

Ø  job的生成是事务性的,保证集群中会有所需数量的副本 

Ø  消费job需要进行确认


2.1生产者模型

image.png

n队列 

Ø  队列可以在一台Server上,也可以在多台不同Server上。 

Ø  队列里面的job不是都在相同的server节点上。

n特点 

Ø  celint发送请求,server进行全量复制,随机复制(同步/异步)到可达的serer节点上。

Ø  单个server宕机后,其他server上的副本可以供继续消费 

Ø  job常驻内存,但是可以进行持久化 

Ø  每个job都有一个id,生产者可以查询该job是否被处理了

n发送job方式 

Ø  通过redis的私有交互协议,走TCP通道。

Ø  不同的job可以带不同的参数,如延迟发送、生存时间副本数量、重发时间等等


2.2消费者模型

image.png

n特点 

Ø  client可以连接任意一个server去消费多个指定队列的job,消费完成后job依旧存在,除非ackjob 

Ø  如果不ACKjobjob可以被多次处理也可能被重复处理,直到TTL时间到了 

Ø  如果job不在当前节点,则需要去其他node拉取job 

Ø  没有offset


3 网络模型

n 套用redis的网络模型 

Ø  基于事件驱动(Event-driven)构建服务。 

Ø  自己实现了事件驱动库 

Ø  可以多平台使用,性能强劲

nDisque网络相关源码:
ae.hae.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 :   BSDAPPLE

nLinux下多路IO封装:
aeApiCreate  创建句柄(epoll_create
aeApiFree  关闭句柄(close
aeApiAddEvent:事件添加(epoll_ctl
aeApiDelEvent  事件删除(epoll_ctl
aeApiPoll  等待事件发生(epoll_wait


4 消息模型

image.png

4.1消息转发流程

image.png


①:clientserver端发送job


②:server端收到job后向其他节点复制job


③:client连接server端消费job


④:如果当前server端没有要消费的job,就从其他节点获取job


⑤:client连接serverack job


⑥:server端给job的其他副本所在的节点设置ack


⑦:server端删除已ack成功的job,并通知其他节点也删除


4.2 消息投递可靠性

nAt least Once

   支持,retry不为0TTL-1,消费后,需要确认;确认ack完成后,job才删除,如果不ack

job会在retry时间间隔后再次发送到队列中;这样保证每个job只是被处理一次。

nAt most Once

  支持,jobretry0,且replication1


4.3持久化

image.png

n  持久化方式 

Ø  Disque使用了类似Redis的持久化的方式,AOF(Append Only File),即每次队列中有数据插入,都将写入aof文件。这样,当Disque重启时,再从aof文件重新恢复队列数据。

n 注意 

Ø  job持久化是使用redisaof持久化方式。 

Ø  默认关闭AOF持久化 

Ø  AOF文件刷新频率可以配置。

Ø  不是严格意义上的持久化,已ack的消息不会写入aof文件中

5 消息QoS

n 可靠性

  job可以有多个副本,存放在不同的server上,只要有一个副本正常,就可以提供服务,job常驻内存,可以使用aof文件进行持久化

n安全

  基于TCP的私有通信协议,可以在一定程度上保证安全 

n时间约束

Job从产生→复制备份→消费→ackdelete

n消息传递的优先级

  尽量提供FIFOjob队列,以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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。