作项目过程接触到disque,记录一下。html
disque是redis之父开源的基于内存的分布式做业队列,用c语言实现的非阻塞网络服务器。c++
disque的设计目标:Its goal is to capture the essence of the "Redis as a jobs queue" use case。翻译过来是把redis做为做业队列。
git
做为消息代理,Disque充当了须要进行消息交换的进程之间的一个中间层,生产者向其中添加供消费者使用的消息。这种生产者-消费者队列模型很是常见,其主要不一样体如今一些细节方面:github
- Disque是一个同步复制做业队列,在默认状况下,新增任务会复制到W个节点上,W-1个节点发生故障也不会影响消息的传递。
- Disque支持至少一次和至多一次传递语义,前者是设计和实现重点,然后者能够经过将重试时间设为0来实现。每一个消息的传递语义都是单独设置的,所以,在同一个消息队列中,语义不一样的消息能够共存。
- 按照设计,Disque的至少一次传递是近似一次传递,它会尽力避免消息的屡次传递。
- Disque集群的全部节点都有一样的角色,也就是“多主节点(multi-master)”。生产者和消费者能够链接到不一样的队列或节点,节点会根据负载和客户端请求自动交换消息。
- Disque支持可选的异步命令。在这种模式下,生产者在向一个复制因子不为1的队列中添加一个做业后,能够没必要等待复制完成就能够转而执行其它操做,节点会在后台完成复制。
- 在超过指定的消息重试时间后,Disque会自动将未收到响应的消息从新放入队列。
- 在Disque中,消费者使用显式应答来标识消息已经传递完成。
- Disque只提供尽力而为排序。队列根据消息建立时间对消息进行排序,而建立时间是经过本地节点的时钟获取的。所以,在同一个节点上建立的消息一般是按建立顺序传递的,但Disque并不提供严格的FIFO语义保证。好比,在消息从新排队或者由于负载均衡而移至其它节点时,消息的传递顺序就没法保证了。因此,Salvatore指出,从技术上讲,Disque严格来讲并非一个队列,而更应该称为消息代理。
- Disque经过四个参数提供了细粒度的做业控制,分别是复制因子(指定消息的副本数)、延迟时间(将消息放入队列前的最小等待时间)、重试时间(设置消息什么时候从新排队)、过时时间(设置什么时候删除消息)。
目前disque的c++客户端只有acl,acl是一个通用的网络通讯和服务器编程框架,对disque的支持是其中的一部分。redis
disque中文文档:http://disquebook.com/install.html 编程
disque github主页:https://github.com/antirez/disque 服务器
acl主页:https://github.com/zhengshuxin/acl/tree/master/lib_acl_cpp/samples/disque 网络