基于 Redis 实现高性能、低延迟的延时消息的方案演进

🎉欢迎来系统设计专栏:基于 Redis 实现高性能、低延迟的延时消息的方案演进

📜其他专栏:java面试 数据结构 源码解读 故障分析


🎬作者简介:大家好,我是小徐🥇
☁️博客首页:CSDN主页小徐的博客
🌄每日一句:好学而不勤非真好学者

📜 欢迎大家关注! ❤️

1、前言

随着互联网的发展,越来越多的业务场景需要使用延时队列。比如:

  • 任务调度:延时队列可以用于任务调度,将需要在未来某个特定时刻执行的任务放入队列中。消息延迟处理: 延时队列可以用于消息系统,其中一些消息需要在一段时间后才能被消费。例如,在需要进行消息重试的情况下,可以将消息放入延时队列,并在一段时间后重新处理订单处理:在电商系统中,有时需要对订单进行一些处理,例如取消未支付的订单或处理退货请求。
  • 会员到期提醒:如果你有一个会员制度,需要提醒会员其订阅即将到期,延时队列可以用于安排在到期日期前发送提醒通知。
  • 缓解高峰期负载:在高峰期,系统可能会面临大量的请求和负载。延时队列可以用于将一些请求推迟处理,进行削峰处理.

随着技术的进步,实现的方式也愈来愈多种多样,以 Java 语言为例,实现的方式也是多如牛毛,例如使用JDK自带的工具包实现;使用任务调度框架实现;使用Netty的时间轮询实现;使用消息队列实现;使用Redis 实现等等。本文主要探讨 Redis 实现延时消息的几种不同的方案演进。

2、技术方案

如前文所述,使用 Redis 来实现延时消息的实现方式主要有 3 种

  1. 过期事件监听
  2. Redis zset (有序集合)
  3. Redisson

得益于 Redis 自身设计的优点,使用 Redis 完全可以支撑高性能的要求。

从可靠性和使用便利性上来考虑,三种方案优先级排序: Redisson > zset> 过期事件监听

46dfb63df13b478ca0615ce730e2518c.png

3、方案一: 过期事件监听

3.1 核心设计与原理

Redis 的过期事件监听是基于 pub/sub 的,key 过期时会 pub 消息到一个内置的 channel 中,客户端可以通过监听这个 channel 获取到消息,:进而实现延时队列的功能

3.2 方案缺陷

缺陷 1: 不支持持久化,可靠性低

pub/sub 模式下的过期事件监听,消息并不会做持久化,会有消息丢失的风险。

缺陷2:不保证及时性

过期事件监听的方案听起来很好理解,也似乎很完美,但事实并非如此。主要是借助 Redis 删除过期 key 的消息监听,不保证及时性

Redis 的单线程设计,如果需要支持定时过期,在 Redis 高负载的情况下或者有大量过期键需要同时处理时,会造成 Redis 服务器卡顿,影响主业务执行。考虑到可用性,Redis 的单线程机制并不能很好地支持定时删除过期 key 的场景,所以 Redis 使用惰性删除 + 定期删除key 的方式
也正因为 Redis key 的删除不是过期即删除的,所以 key 删除时发送消息的时间也不一定是 key的过期时间。

失效场景可以参考下图:

f98275d928a8414ba6d0c106311df9a1.png

4、方案二: zset

Redis 提供了有序集合 zset,我们也可以利用 zset 封装延迟消息
zset 的常用命令及解释

ZADD key score member [score member ...]: 向有序集合 key 中添加一个或多个成员,每个成员都带有一个分值 score


ZRANGEBYSCORE key min max [WITHSCORES]: 返回有序集合 key 中分值介于 min 和 max 之间的成员。可选的 WITHSCORES 参数表示同时返回成员和分值


ZREM key member [member ...]: 从有序集合 key 中移除一个或多个成员

4.1 核心设计与原理

核心设计为使用 zset + 定时轮询器,基于 zset 的 ZRANGEBYSCORE 命获取已过期的延时任务,流程如下图所示:

7a346e42cd994cc1b5baa5b652c992e6.png

4.2 方案缺陷

直接使用 zset 也存在一些端

缺陷 1: 额外的资源消耗

使用有序集合作为延时队列,并且需要定期地检查有序集合中的任务是否需要被处理,会占用CPU

资源2缺陷 2:使用上不够友好

需要自行封装,增加编码,在维护上增加了许多成本

5、方案三: Redisson

基于 4.2 小节的考虑,我们可以考虑使用 Redisson 提供的延时队列,它也是基于 zset 实现

5.1 核心设计与原理

Redisson 封装的延时队列源码还是蛮多的,限于篇幅,之后看情况再补充源码分析篇。本文只讲解源码核心链路的封装。

Redisson 封装了两个核心队列: RBlockingQueue 和 RDelayedQueue,其中 RDelayedQueue 作为中间队列,RBlockingQueue 作为目标消费队列。

1bafa3fba90a451882864e1fab223010.png

5.2 方案优点

  1. 简单易用:可以通过注册监听的方式获取延时消息。
  2. 批量处理,低延迟: Redisson 延时队列使用定时任务进行批量处理,而不是每个任务都单独处理。这种批处理方式减少了与Redis的通信次数,提高了处理效率
  3. 异步处理: Redisson的延时队列支持异步任务处理,减少了等待时间和阻塞,提升了整体的吞吐量和响应性能。
  4. 支持分布式: Redisson的延时队列可以在分布式环境中使用,并提供了分布式锁和协调机制确保多个节点或实例之间的任务处理的一致性和可靠性。
  5. 延迟更低: Redisson 底层使用了 HashedWheelTimer,基于时间轮算法,具有高性能、较高精确度、内存友好、并发安全的特点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA vlan练习

目录 实验拓扑 实验要求 实验步骤 1、交换机创建vlan 2、交换机上的各个接口划分到对应vlan中 3、trunk干道 4、路由器单臂路由 5、路由器DHCP设置 实验测试 华为交换机更换端口连接模式报错处理 实验拓扑 实验要求 根据图划分vlan,并通过DHCP给主机下发…

Tomcat的maxParameterCountmaxPostSize参数

Tomcat的maxParameterCount&maxPostSize参数 Tomcat的maxParameterCount&maxPostSize参数1.问题1.1问题现象1.2 参数总结1.3 问题总结 2 Tomcat官网的解释2.1 到https://tomcat.apache.org/找到文档入口2.2 找到文档的Reference2.3 查看配置文件的参数 3 文档看不明白&…

上位机图像处理和嵌入式模块部署(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉,以传统算法和光源控制为主,部分采用了深度学习技术…

回溯算法理论基础

回溯算法介绍 回溯算法与递归函数相辅相成,它是一种纯暴力搜索,可以使用剪枝等方式进行优化 解决问题 组合问题切割问题子集问题排列问题棋盘问题 可视化理解 可以理解为一种 n 叉树型结构,树的最大宽度为遍历的元素数量,树的…

vivado JTAG链、连接、IP关联规则

JTAG链 这列出了定义板上可用的不同JTAG链。每个链都列在下面<jtag_chain>以及链的名称&#xff0c;以及定义名称和链中组件的位置&#xff1a; <jtag_chains> <jtag_chain name"chain1"> <position name"0" component"part0…

MySQL不同插入方式性能对比实验

最近负责的项目需要数据同步入库MySQL&#xff0c;为了测速那种入库方式效率比较高&#xff0c;为此进行了以下的对比实验&#xff0c;在此记录一下 实验表单数据格式 实验代码 共三种方法对比 mutiSqlInsert: 一条一条插入&#xff0c;最后一次提交 singleSqlInsert&…

黑马苍穹外卖Day10学习

文章目录 Spring Task介绍cron表达式入门案例 订单状态定时处理需求分析代码开发功能测试 WebSocket介绍入门案例 来单提醒需求分析代码开发 客户催单需求分析代码开发 Spring Task 介绍 cron表达式 入门案例 订单状态定时处理 需求分析 代码开发 新建一个task包里面编写代码…

像 Google SRE 一样 OnCall

在 Google SRE 的著作《Google运维解密》(原作名&#xff1a;Site Reliability Engineering: How Google Runs Production Systems)中&#xff0c;Google SRE 的关键成员们几乎不惜用了三个章节的篇幅描述了在 Google 他们是如何 OnCall 的。 Google SRE 实践中&#xff0c;有…

HFSS笔记/信号完整性分析(二)——软件仿真设置大全

文章目录 1、多核运算设置1.1 如何设置1.2 如何查看自己电脑的core呢&#xff1f;1.3 查看求解的频点 2、求解模式设置Driven Terminal vs Driven modal 3、Design settings4、自适应网格划分5、更改字体设置 仅做笔记整理与分享。 1、多核运算设置 多核运算只对扫频才有效果&…

Django 图片上传与下载

写在前面 在Web开发中&#xff0c;文件上传和下载是常见的功能之一。 Django 是一位魔法师&#x1fa84;&#xff0c;为我们提供了 FileField 和 ImageField 等神奇得字段类型&#xff0c;以及相应的视图和模板标签&#xff0c;使得处理文件变得十分便捷。本文以图片上传作为…

GPT-4 的决策在股市中进行量化投资

论文题目:Can Large Language Models Beat Wall Street? Unveiling the Potential of AI in Stock Selection 论文链接:https://arxiv.org/abs/2401.03737 博客地址:https://www.marketsense-ai.com/ 从本质上来说&#xff0c;股票选择是个价格发现机制&#xff0c;在股票投…

深入解析ESP32C3(2)- 存储类型和地址空间

ESP32C3芯片的存储资源 • 384 KB 的ROM&#xff1a;用于程序启动和内核功能调用 • 400 KB 片上SRAM&#xff1a;用于数据和指令存储&#xff0c;时钟频率可配置&#xff0c;最大160 MHz。400 KB SRAM 中&#xff0c;有16 KB 配置为cache 专用 • RTC 快速存储器&#xff1a;…

VC++中使用OpenCV进行形状和轮廓检测

VC中使用OpenCV进行形状和轮廓检测 在VC中使用OpenCV进行形状和轮廓检测&#xff0c;轮廓是形状分析以及物体检测和识别的有用工具。如下面的图像中Shapes.png中有三角形、矩形、正方形、圆形等&#xff0c;我们如何去区分不同的形状&#xff0c;并且根据轮廓进行检测呢&#…

初学python系列: pandas操作excel

媳妇工作中经常用到excel处理&#xff0c;想用python处理excel更高效&#xff0c;所以自学了python&#xff0c;觉得python比Java还是简单多了&#xff0c;没有变量类型声明&#xff0c;比Java也就多了元组&#xff0c;各种库很丰富。 需求是&#xff1a; 汇总两个excel中 列&…

【MySQL】一文总结MVCC多版本并发控制

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Log版本链Read ViewRead View 可见性原则 RC 和 RR 下的 Read ViewRC 下的 Read ViewRR 下的 Read View小结RR 级别下能否防止幻读总结 MVCC 介绍 在当今高度并发的数据库环境中&#xff0c;有效的并发控…

系统架构设计师教程(十二)信息系统架构设计理论与实践

信息系统架构设计理论与实践 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企…

flink结合Yarn进行部署

1. 什么是Yarn模式部署Flink 独立&#xff08;Standalone&#xff09;模式由 Flink 自身提供资源&#xff0c;无需其他框架&#xff0c;这种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但我们知道&#xff0c;Flink 是大数据计算框架&#xff0c;不是资…

[娱乐]索尼电视安装Kodi

索尼电视不能直接apk安装kodi应用 android studio安装后附带 abd&#xff0c; 路径 C:\Users\[yourname]\AppuoData\Local\Android\Sdk\platform-tools\adb.exe安卓电视点击内部版本号&#xff0c;启用开发者模式 adb 连接索尼安卓电视&#xff0c;记得电视上运行调试 abi选…

Vue——计算属性

文章目录 计算属性computed 计算属性 vs methods 方法计算属性完整写法 综合案例&#xff1a;成绩案例 计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来的新属性。依赖的数据变化&#xff0c;自动重新计算 语法: ①声明computed配置项中&#xff0c;一个计算属性…

stable diffuison的安装和使用

stable diffuison的安装和使用 简单介绍 Stable Diffusion是一个深度学习文本到图像的生成模型&#xff0c;它可以根据文本描述生成详细的图像。这个模型主要应用于文本生成图像的场景中&#xff0c;通过给定的文本提示词&#xff0c;模型会输出一张与提示词相匹配的图片。 S…