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

这篇具有很好参考价值的文章主要介绍了基于 Redis 实现高性能、低延迟的延时消息的方案演进。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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


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

📜 欢迎大家关注! ❤️

1、前言

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

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

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

2、技术方案

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

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

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

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

基于 Redis 实现高性能、低延迟的延时消息的方案演进,系统设计,java,后端,redis,中间件

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的过期时间。

失效场景可以参考下图:

基于 Redis 实现高性能、低延迟的延时消息的方案演进,系统设计,java,后端,redis,中间件

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 命获取已过期的延时任务,流程如下图所示:

基于 Redis 实现高性能、低延迟的延时消息的方案演进,系统设计,java,后端,redis,中间件

4.2 方案缺陷

直接使用 zset 也存在一些端

缺陷 1: 额外的资源消耗

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

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

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

5、方案三: Redisson

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

5.1 核心设计与原理

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

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

基于 Redis 实现高性能、低延迟的延时消息的方案演进,系统设计,java,后端,redis,中间件文章来源地址https://www.toymoban.com/news/detail-815394.html

5.2 方案优点

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

到了这里,关于基于 Redis 实现高性能、低延迟的延时消息的方案演进的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高性能消息中间件 RabbitMQ

    消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的 异步通信 。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复: 异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系。 消息

    2024年02月11日
    浏览(108)
  • 基于Springboot3+微服务实现12306高性能售票系统

    💗博主介绍:全网CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者。 专注于Java、小程序技术领域和毕业项目实战💗 ✌Java、SSM+Vue、SpringBoot+Vue、NodeJS+Vue、微信小程序、Python、大数据、安卓。 你想要的我

    2024年02月20日
    浏览(76)
  • 高性能计算实验——矩阵乘法基于MPI的并行实现及优化

    熟练掌握MPI编程方法,并将通用矩阵乘法转为MPI并行实现,进一步加深MPI的使用与理解。 进一步熟悉MPI矩阵乘法的实现,学习MPI点对点通信与集合通信的异同点和各自的优缺点,学会比较二者的性能以及各自使用的情形。 学习如何将自己编写的代码改造为标准库函数,供其

    2024年02月03日
    浏览(55)
  • 深入了解 RabbitMQ:高性能消息中间件

    在现代分布式系统中,消息队列成为了实现系统间异步通信、削峰填谷以及解耦组件的重要工具。而RabbitMQ作为一个高效可靠的消息队列解决方案,已经成为许多企业广泛采用的选择。本文将介绍RabbitMQ的基本概念、主要特性以及常见应用场景。 RabbitMQ 是一个开源的高性能、

    2024年02月08日
    浏览(52)
  • 深入详解高性能消息队列中间件 RabbitMQ

      目录 1、引言 2、什么是 RabbitMQ ? 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++软件异常排查从入

    2024年02月05日
    浏览(80)
  • 【Redis】Redis 高性能IO模型原理

    在面试的时候遇到Redis肯定会问,Redis单线程为什么那么快呀?你可以说下你对IO多路复用的机制嘛。但是仔细一想Redis真的是单线程在运行处理嘛,其实这个单线程主要指的Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求,包括socket读取、解析、执

    2024年02月04日
    浏览(55)
  • [RDMA] 高性能异步的消息传递和RPC :Accelio

    1. Introduce Accelio是一个高性能异步的可靠消息传递和RPC库,能优化硬件加速。 RDMA和TCP / IP传输被实现,并且其他的传输也能被实现,如共享存储器可以利用这个高效和方便的API的优点。Accelio 是 Mellanox 公司的RDMA中间件,用于高性能异步的可靠消息传递和RPC库。 Accelio提供了一

    2024年02月12日
    浏览(42)
  • 解析RocketMQ:高性能分布式消息队列的原理与应用

    什么是消息队列 消息队列是一种消息传递机制,用于在应用程序和系统之间传递消息,实现解耦和异步通信。它通过将消息发送到一个中间代理(消息队列),然后由消费者从该队列中获取消息并处理。 RocketMQ简介 RocketMQ是阿里巴巴开源的一款高性能分布式消息队列系统。它

    2024年02月14日
    浏览(52)
  • Kafka 最佳实践:构建可靠、高性能的分布式消息系统

    Apache Kafka 是一个强大的分布式消息系统,被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势,需要遵循一些最佳实践,确保系统在高负载下稳定运行,数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践,并提供丰富的示例代码,帮助读者更好地应用

    2024年02月03日
    浏览(63)
  • Redis核心数据结构实战与高性能解析

    目录 一、安装Redis 二、Redis线程与高性能 2.1 Redis是单线程么? 2.2 Redis读写是单线程为何这么快? 2.3 Redis如何处理并发操作命令? 三、核心数据结构实战 3.1 字符串常用操作实战 SET 存入键值对 SETNX SETEX MSET 批量存入键值对 MSETNX DECR 原子减1 DECRBY 原子减 INCR 原子加1 INCRBY 原子

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包