延时任务通知服务的设计及实现(一)-- 设计方案

news2024/9/24 7:20:32

一、背景

在日常编程中,总是会遇到延时执行的任务。比如:定期发送邮件,定时上架商品;再比如订单在一定时间内未支付,需要到期关闭订单。

你也许会借助分布式任务xxl-job来实现,不仅性能差,cron执行的间隔时长也影响了业务的准确性。

本文及下面的几个文章,将讨论如何实现一个通用的延时任务通知服务:

  • 设计方案
  • redisson的延迟队列RDelayedQueue
  • JDK的延迟队列DelayQueue
  • webhook执行任务

二、业务要求

  • 支持业务方对任务进行增删改查
  • 支持跨服务之间的调用
  • 延时任务通知服务,作为基础服务,不关心具体业务

三、技术要求

  • 回调时间的误差在2秒内
  • 数据需要持久化
  • 系统扩展性强:当任务量大的时候,可以横向扩展节点

四、设计方案

在这里插入图片描述

1、任务模块

业务服务通过http接口,对任务进行增删改改, 实时同步mysql数据库。

使用分布式缓存redis保存任务,提高任务的读取效率,redis 的key是任务的交易流水号。

作为任务的唯一标识,业务方需要生成一个交易流水号,保证全局唯一。

2、延迟队列模块

这是本文的重点,这里介绍两种实现。

  • redisson RDelayedQueue (分布式延迟队列)
  • Java DelayQueue (进程内的延迟队列)

后者是进程内的延迟队列,需要我们去解决分布式问题,相对会复杂一些。

任务模块会调用延迟队列模块,当任务被增删改的时候,需要同步至延迟队列。

3、webhook模块

定义一个延迟队列的消费者,监听到期的延迟任务。
得到延迟任务中的交易流水号,查询任务的回调地址和回调内容,执行http回调业务方。

五、数模设计

数据存储只需要一张表 ---- 任务表,见下:

CREATE TABLE `notify_task` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `task_code` varchar(64) NOT NULL COMMENT '任务编号',
  `trans_no` varchar(32) NOT NULL COMMENT '交易流水号',
  `notify_date` datetime NOT NULL COMMENT '通知时间',
  `notify_url` varchar(255) NOT NULL COMMENT '通知地址',
  `notify_params` varchar(4000) DEFAULT NULL COMMENT '通知内容,json格式',
  
  `is_retry` tinyint(1) DEFAULT 0 COMMENT '是否支持重试',
  `retry_times` int(11) DEFAULT 0 COMMENT '重试次数',
  
  `finished_gmt` datetime DEFAULT NULL COMMENT '完成时间',
  `is_finished` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否完成',
  
  `marked` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已标记',
  
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
  `create_gmt` datetime DEFAULT current_timestamp() COMMENT '创建时间',
   `modified_by` varchar(64) DEFAULT NULL COMMENT '更新人',
  `modified_gmt` datetime DEFAULT current_timestamp() COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNQ_TRANS_NO` (`trans_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在这里插入图片描述

六、生成任务的交易流水号

上面任务表的交易流水号生成规则是:md5(回调时间+回调地址+回调内容)。

要保证交易流水号唯一的方法有很多,但是业务方在创建任务的时候,可能不想或无法存储交易流水号,而在后面又可能修改任务的回调时间,再或者需要提前取消任务。

建议业务方只基于请求的信息进行Md5,把该值作为双方的交易流水号。

七、接口设计

在这里插入图片描述

1、新增任务

参数名称参数说明请求类型是否必须数据类型schema
requestrequestbodytrueTaskCreateRequestTaskCreateRequest
  isRetry是否支持重试falseboolean
  notifyDate通知时间,格式:yyyyMMddHHmmsstruestring
  notifyParams通知内容,json格式falsestring
  notifyUrl通知地址truestring
  taskCode任务编号truestring
  transNo交易流水号,由业务方生成并保存。删除和修改任务时,需要传递该值truestring
{
  "isRetry": true,
  "notifyDate": "20240426163900",
  "notifyParams": "{\"id\":2,\"name\":\"Jack\",\"position\":\"Assistant\"}",
  "notifyUrl": "https://webhook.site/76b884f7-ecf5-4821-9d98-4042ae776cd3",
  "taskCode": "webhooksite",
  "transNo": "123456089"
}

在这里插入图片描述

2、修改任务

参数名称参数说明请求类型是否必须数据类型schema
requestrequestbodytrueTaskEditRequestTaskEditRequest
  notifyDate通知时间,格式:yyyyMMddHHmmsstruestring
{
  "notifyDate": "20240426163400"
}

在这里插入图片描述

3、删除任务

在这里插入图片描述

限于篇幅,本文对延时任务通知的设计方案就整理到这里,后面将详细介绍延迟队列的实现。

附:相关系列文章链接

延时任务通知服务的设计及实现(一)-- 设计方案

延时任务通知服务的设计及实现(二)-- redisson的延迟队列RDelayedQueue

延时任务通知服务的设计及实现(三)-- JDK的延迟队列DelayQueue

延时任务通知服务的设计及实现(四)-- webhook执行任务

延时任务通知服务的设计及实现(五)-- Netty时间轮HashedWheelTimer

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web安全研究(九)

知识星球 首先推荐一下我们的知识星球,以AI与安全结合作为主题,包括AI在安全上的应用和AI本身的安全; 加入星球你将获得: 【Ai4sec】:以数据驱动增强安全水位,涵盖内容包括:恶意软件分析,软件安全,AI安全,数据安全,系统安全,流量分析,防爬,验证码等安全方向。…

GStreamer日志调试笔记

1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果: 3、使用--gst-debug设置相应日志类型的相应等级,越大显示日志越多,排查内存泄露可以设置为9 …

一对一WebRTC视频通话系列(四)——offer、answer、candidate信令实现

本篇博客主要讲解offer、answer、candidate信令实现,涵盖了媒体协商和网络协商相关实现。 本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点,代码全部进行了注释,便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客 一…

图像处理

图像处理 导入图片 导入io模块,读取文件所在位置,将生成的图像数据赋给变量img,显示图像 from skimage import ioimgio.imread(D:\工坊\图像处理\十个勤天2.png)io.imshow(img) 运行结果: 将图片进行灰度处理 from skimage i…

透明屏幕的透明度如何?能否实现真正的透明效果?

透明屏幕的透明度是一个关键的特性,其实际表现会因技术、材料和设计等因素而有所不同。目前,透明屏幕技术已经取得了显著的进步,尤其是在OLED(有机发光二极管)领域。 OLED透明屏幕由于其自发光的技术优势,能…

如何修改图片大小?调整图片大小的几个方法介绍

当我们在不同的应用场景中使用图片的时候,常常会需要去调整图片尺寸来适应不同的要求,还有图片体积大小也会有要求,这时候就需要用到我们今天分享的这款图片在线处理工具了,不管是图片改大小或者图片压缩它都能快速解决&#xff0…

Hadamard Product(点乘)、Matmul Product(矩阵相乘)和Concat Operation(拼接操作)在神经网络中的应用

Hadamard乘积(Hadamard Product),矩阵乘法(Matmul Product)和拼接操作(Concatenation Operation)在神经网络中的使用情况如下: Hadamard Product点乘、内积: Hadamard乘…

websevere服务器从零搭建到上线(二)|Linux上的五种IO模型

文章目录 阻塞 blocking非阻塞 non-blockingIO复用 IO multiplexing信号驱动 signal-driven异步 asynchronous拓展知识 看过上篇文章英国基本能理解本文五张图的内容websevere服务器从零搭建到上线(一)|阻塞、非阻塞、同步、异步 本文要能够在…

使用Python编写自动化测试代码规范整理

大家好,我们平时在写自动化测试脚本或者性能测试脚本时,需要注意代码规范,提高代码的可读性与维护性,之前给大家分享过pycharm的两个插件,大家可以参考:Pycharm代码规范与代码格式化插件安装 本文中主要从自…

突破销量瓶颈:亚马逊,速卖通,国际站销量提升实战技巧

1、精心选品:选品是亚马逊销售的第一步,也是至关重要的一步。卖家应该进行市场调研,了解消费者的需求和喜好,选择有市场潜力的产品。要注意产品的差异化,避免与竞争对手的产品过于相似。 2、优化产品详情页&#xff1…

BERT模型的网络结构解析 运行案例分析

整体结构 第一部分:嵌入层第二部分:编码层第三部分:输出层 对于一个m分类任务,输入n个词作为一次数据,单个批次输入t个数据,在BERT模型的不同部分,数据的形状信息如下: 注1&#x…

(ARM-Linux) ORACLE JDK 22 的下载安装及环境变量的配置

目录 获取JDK 安装JDK 配置JAVA环境变量 其他补充:JDK 22的新特征 1. 语法 2. 库 3. 性能 4. 工具 在今年的3月份,ORACLE 更新了的JDK 发行版 JDK 22,作为了一位ORACLE Primavera系列产品的研究者,其实对JDK的迭代完全不感…

信创基础软件之操作系统

操作系统概述 操作系统是计算机系统软硬件资源的纽带。操作系统是连接硬件和数据库、中间件、应用软件的纽带,是承载各种信息设备和软件应用的重要基础软件。操作系统控制和管理整个计算机系统的硬件、软件资源,组织和调度计算机工作和资源,…

linux部署java1.8(java17)

两种方式: 方式一 1.输入查找命令: yum -y list java*2.输入安装命令: yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装: java -version方式二: 点击链接进入官网:https://www.oracle.com/…

五一反向旅游,景区“AI+视频监控”将持续助力旅游业发展

一、建设背景 每年五一劳动节出去旅游都是人挤人状态,这导致景区的体验感极差。今年“五一反向旅游”的话题冲上了热搜,好多人选择了五一之后再出去旅游,避开拥挤的人群,这个时候景区的监管力度和感知能力就更要跟上去&#xff0…

前端 | 经典代办框实现(喵喵大王ver)

文章目录 📚实现效果📚模块实现解析🐇html🐇css🐇javascript 📚实现效果 输入框输入,点击Submit按钮提交,下方显示 设置事项上限6条(按照条数设置限制,默认每…

go-mysql-transfer 同步数据到es

同步数据需要注意的事项 前提条件 1 要同步的mysql 表必须包含主键 2 mysql binlog 必须是row 模式 3 不支持程序运行过程中修改表结构 4 要赋予连接mysql 账号的权限 reload, replication super 权限 如果是root 权限则不需要 安装 go-mysql-transfer ​ git clone…

MySQL从入门到高级 --- 5.DQL基本操作

文章目录 第五章:5.基本操作 - DQL5.1 运算符逻辑运算符位运算符算术运算符 5.2 条件查询5.3 排序查询5.4聚合查询5.4.1 聚合查询-NULL值处理 5.5 分组查询 - group by5.5.1 条件筛选 - having5.6 分页查询 - limit5.7 INSERT INTO SELECT 语句5.8 练习5.9 正则表达…

服务器端优化-Redis内存划分和内存配置

6、服务器端优化-Redis内存划分和内存配置 当Redis内存不足时,可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到90%以上时就需要我们警惕,并快速定位到内存占用的原因。 有关碎片问题分析 Redis底层分配并不是这个key有多大&…

单体服务-微服务-分布式 [三兄弟的区别]

大家好,我是晓星航。今天为大家带来的是 单体服务-微服务-分布式 [三兄弟的区别] 相关的讲解!😊 文章目录 1.单体服务1.1单体服务架构的基本介绍1.2单体服务的优缺点 2.微服务2.1微服务架构的基本介绍2.2微服务架构的优缺点 3.分布式4.三兄弟…