当前位置: 首页 > news >正文

Kafka + 时间轮 + 数据库实现延迟队列方案

Kafka 原生不支持延迟队列功能。而RabbitMQ、RocketMQ及Redis等其他消息队列原生支持延迟队列。

RabbitMQ

RocketMQ

Redis

实现方式

通过插件实现,消息进入延迟队列后根据配置时间过滤转发。

原生支持,发送消息时设置延迟级别,定时任务处理到期消息。

通过sorted set实现,消息按延迟时间存储。

特点

优点:易于部署使用,支持消息重试和顺序处理。

缺点:性能较低,不适合高并发场景。

优点:高性能、支持分布式和消息持久化。

缺点:不支持动态添加/删除队列。

优点:性能高,支持高并发。

缺点:消息未经持久化,存在丢失风险。

适用场景

中小型任务调度和消息通知。

大规模数据处理,高性能要求场景。

轻量级任务调度和短期延迟任务。

表 RabbitMQ、RocketMQ及Redis实现延迟方案对比

延迟队列的其他实现方式:

1)  数据库 + 定时任务。

实现:将消息存储到数据库并记录目标执行时间,定时任务轮询数据库,将到期的消息取出并消费。

优点:延迟时间精准控制,可靠性高。

缺点:依赖数据库,性能受限。

适用场景:延迟时间不固定,消息量不大。

2) Redis ZSet方案

实现:利用Redis有序集合(ZSet),以消息的执行时间作为score,消费者定时轮询到期消息。

优点:基于内存,性能高。

缺点:消息可能丢失。

1 Kafka + 时间轮 + 数据库实现延迟队列

实现:创建一个延迟队列Topic,将需要延迟的消息发送到这里。该Topic由一个专门的消费者处理。通过时间轮将读取的延迟队列消息存储并在消息的期望执行时间将消息再发送到目标Topic。

图 Kafka + 时间轮实现延迟队列示例图

1.1 时间轮可靠性保证

方案的关键在于时间轮,时间轮是在内存中的数据结构,除了需要保证消息的准时性,还需要可靠性,即当项目重启后,原先在时间轮中的消息不能丢失。

当消息进入时间轮时,同步将这个消息存储到数据库中,状态为待完成,当这条消息被处理后,标注为已完成。

当系统重启时,从数据库中获取待处理的任务,并把它们放入到时间轮中。

​​​​​​​1.2 角色职责及数据结构

表 Kafka + 时间轮 + 数据库实现延迟队列

延迟消息:指定执行日期的消息,包含字段:id、执行日期、目标topic、状态(待执行、执行完成、执行失败)、目标参数。

延迟消息生产者:业务代码中延迟任务的产出源头。负责将延迟消息发送给Kafka的延迟队列Topic。

延迟队列Topic消费者:消费Kafka 延迟队列Topic的消息,将待执行的消息放入到时间轮中,同时将其持久化到数据库中。

时间轮:负责延迟消息的调度,将要执行的消息发送到Kafka的目标Topic中。

目标Topic消费者:消费Kafka目标Topic的消息,并根据消息的id,来更新其在数据库中的状态。

http://www.dtcms.com/a/321539.html

相关文章:

  • 前端开发:JavaScript(7)—— Web API
  • 机器学习视角下的黄金市场动态:3400美元关口的多因子驱动机制
  • Seata分布式事务环境搭建
  • Access开发右下角浮窗提醒
  • RS485转Profibus网关在QDNA钠离子分析仪与S7-300PLC系统集成中的应用
  • 深入解析K-means聚类:从原理到调优实战
  • 基于STM32F030C8T6单片机实现与CH224Q诱骗芯片的I2C通信和电压输出配置
  • 9:USB摄像头的最后一战(上):MP4音视频合封!
  • 《MySQL索引底层原理:B+树、覆盖索引与最左前缀法则》
  • TF 上架全流程实战,从构建到 TestFlight 分发
  • iOS 签名证书全流程详解,申请、管理与上架实战
  • 飞算JavaAI深度剖析:开启Java开发智能新时代
  • 路由器不能上网的解决过程
  • 综合实验作业
  • Web Worker 性能革命:让浏览器多线程为您的应用加速
  • OpenAI 开源 GPT-OSS:1200亿参数推理模型上线,完全免费、商用可用,全民可控智能体时代正式开启!
  • 异步改变Promise状态与then调用顺序
  • 零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南
  • 【完整源码+数据集+部署教程】植物病害检测系统源码和数据集:改进yolo11-MultiSEAMHead
  • SpringBoot的profile加载
  • Cesium 模型3dtiles 开挖 挖洞 压平
  • 单层 PDF 与双层 PDF:一字之差,功能大不同
  • 如何高效使用Cursor?要节省者用?
  • 【代码随想录day 14】 力扣 104.二叉树的最大深度
  • 机器学习及其KNN算法
  • 静态路由主备切换
  • 力扣-189.轮转数组
  • MetaBit基金会加码投资图灵协议,深化去中心化金融与元宇宙生态合作
  • mysql复制连接下的所有表+一次性拷贝到自己的库
  • 本地开发penpot源码支持AI原型设计(一)