【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

Disque:Redis 之父新开源的分布式内存作业队列

  • 2015-04-29
  • 本文字数:1441 字

    阅读完需:约 5 分钟

Disque Redis 之父 Salvatore Sanfilippo 新开源的一个分布式内存消息代理。它适应于“Redis 作为作业队列”的场景,但采用了一种专用、独立、可扩展且具有容错功能的设计,兼具 Redis 的简洁和高性能,并且用 C 语言实现为一个非阻塞网络服务器。有一点需要提请读者注意,在 Disque 项目文档及本文中,“消息(Message)”和“作业(Job)”可互换。

Disque 是一个独立于 Redis 的新项目,但它重用了 Redis 网络源代码、节点消息总线、库和客户端协议的一大部分。由于 Disque 使用了与 Redis 相同的协议,所以可以直接使用 Redis 客户端连接 Disque 集群,只是需要注意,Disque 的默认端口是 7711,而不是 6379。

作为消息代理,Disque 充当了需要进行消息交换的进程之间的一个中间层,生产者向其中添加供消费者使用的消息。这种生产者 - 消费者队列模型非常常见,其主要不同体现在一些细节方面:

  • Disque 是一个同步复制作业队列,在默认情况下,新增任务会复制到 W 个节点上,W-1 个节点发生故障也不会影响消息的传递。
  • Disque 支持至少一次和至多一次传递语义,前者是设计和实现重点,而后者可以通过将重试时间设为 0 来实现。每个消息的传递语义都是单独设置的,因此,在同一个消息队列中,语义不同的消息可以共存。
  • 按照设计,Disque 的至少一次传递是近似一次传递,它会尽力避免消息的多次传递。
  • Disque 集群的所有节点都有同样的角色,也就是“多主节点(multi-master)”。生产者和消费者可以连接到不同的队列或节点,节点会根据负载和客户端请求自动交换消息。
  • Disque 支持可选的异步命令。在这种模式下,生产者在向一个复制因子不为 1 的队列中添加一个作业后,可以不必等待复制完成就可以转而执行其它操作,节点会在后台完成复制。
  • 在超过指定的消息重试时间后,Disque 会自动将未收到响应的消息重新放入队列。
  • 在 Disque 中,消费者使用显式应答来标识消息已经传递完成。
  • Disque 只提供尽力而为排序。队列根据消息创建时间对消息进行排序,而创建时间是通过本地节点的时钟获取的。因此,在同一个节点上创建的消息通常是按创建顺序传递的,但 Disque 并不提供严格的 FIFO 语义保证。比如,在消息重新排队或者因为负载均衡而移至其它节点时,消息的传递顺序就无法保证了。所以,Salvatore 指出,从技术上讲,Disque 严格来说并不是一个队列,而更应该称为消息代理。
  • Disque 通过四个参数提供了细粒度的作业控制,分别是复制因子(指定消息的副本数)、延迟时间(将消息放入队列前的最小等待时间)、重试时间(设置消息何时重新排队)、过期时间(设置何时删除消息)。

需要注意的是,Disque 项目尚处于 Alpha 预览测试阶段,代码和算法未经充分测试,还不适合用于生产环境。在接下来的几个月里,其实现和 API 很可能会发生重大变化。此外,它还有如下限制:

  • 其中还包含许多没有用到的 Redis 代码;
  • 它并非源于 Salvatore 的项目需求,而是源于他看到人们将 Redis 用作队列,但他不是这方面的专家;
  • 同 Redis 一样,它是单线程的,但鉴于它所操作的数据结构并不复杂,将来可以考虑改为多线程;
  • Disque 进程中的作业数量受可用内存限制;
  • Disque 没有进行性能优化。

总之,该项目尚处于研究测试阶段。感兴趣的读者可以查看该项目的 GitHub 页面,了解更多信息。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群InfoQ 好读者)。

2015-04-29 08:4614207
用户头像

发布了 1008 篇内容, 共 370.5 次阅读, 收获喜欢 340 次。

关注

评论

发布
暂无评论
发现更多内容

【Vuex 源码学习】第八篇 - Vuex 对 State 状态的处理

Brave

源码 vuex 10月月更

【初恋系列】我轻轻的走了,正如我轻轻的来(微博评论实战)

人工智能~~~

高可用 高性能 微博评论架构实战

Android平台音视频实战|引航计划|音视频

轻口味

音视频 引航计划 内容合集 技术专题合集

🏆【Alibaba工具型技术系列】「EasyExcel技术专题」实战技术针对于项目中常用的Excel操作指南

洛神灬殇

Excel EasyExcel Alibaba Alibaba技术 10月月更

Zabbix VS Prometheus :哪个更适合你

耳东@Erdong

后端 Prometheus zabbix 引航计划 10月月更

私有云部署系列之动态IP获取(程序编写)

稻草鸟人

NodeJs 全栈创建多文件断点续传

devpoint

大前端 upload 引航计划 10月月更

为什么感觉假期还没开始就快要结束了?

脑极体

在线RGB和HEX十六进制颜色互转工具

入门小站

工具

什么是机器学习, CNN TensorFlow by Google神经网络深度学习 易筋 ARTS 打卡 Week 69

John(易筋)

ARTS 打卡计划

音视频全链路开发实践|引航计划|音视频

轻口味

音视频 引航计划 内容合集 技术专题合集

大数据作业Spark sql

Clarke

大前端:入门CSS的编程世界~

Bob

CSS 大前端 引航计划

从零开发一款Android Rtmp播放器

轻口味

android 音视频 引航计划 10月月更

009云原生之分布式事务模式

穿过生命散发芬芳

云原生 10月月更

惊艳!阿里出产的MyCat性能笔记,带你领略什么叫细节爆炸

Java 架构 面试 程序人生 编程语言

模块五作业

Geek_fc100d

「架构实战营」

模块六作业

Geek_fc100d

「架构实战营」

金九银十一线大厂Java面试题大全(整理版)1000+面试题附答案详解,最全面详细!

Java 程序员 架构 面试 后端

linux之history命令

入门小站

Linux

架构实战营模块九作业

maybe

12道Zookeeper高频面试题,你顶得住吗?

Java 架构 面试 分布式 后端

面试进阶必备:“阿里爸爸”高并发秒杀架构设计笔记(全彩版)

Java 架构 面试 程序人生 编程语言

Spark 系列教程(2)运行模式介绍

Se7en

自我提升:方法探索

程序员架构进阶

自我管理 时间管理 自我提升 10月月更

【Flutter 专题】36 图解 Flutter 基本动画 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Python代码阅读(第33篇):反转字典

Felix

Python 编程 Code Programing 阅读代码

靠这份GitHub star过万的1121页图解算法成功杀进字节跳动

Java 架构 面试 程序人生 编程语言

(深入篇)漫游语音识别技术—带你走进语音识别技术的世界

攻城先森

深度学习 音视频 nlp 语音识别

金九银十旗开得胜!秋招字节正式批4面,顺利拿到offer

Java 架构 面试 程序人生 编程语言

这份笔记太牛了!手把手教你从零开始搭建Spring Cloud Alibaba!

Java 架构 面试 程序人生 编程语言

Disque:Redis之父新开源的分布式内存作业队列_GitHub_谢丽_InfoQ精选文章