分布式-异步延时任务

背景

​ 实际业务研发中,存在需要异步执行、或者延时执行某些操作,且这些操作支持重试,需要一个异步延时任务来支撑

方案设计

方案组合:Mysql持久化 + RabbitMQ异步解耦 + 定时任务定时轮询

1、状态流转图

image-20230314224717884

2、数据库设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `sup_task`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '任务id',
`task_type` tinyint NOT NULL DEFAULT '1' COMMENT '任务类型',
`task_param` text COMMENT '任务参数',
`task_keyword` varchar(128) NOT NULL DEFAULT '' COMMENT '关键字',
`task_state` int NOT NULL DEFAULT '1' COMMENT '任务状态 1 待执行 2 执行中 3 执行成功 4 执行失败 ',
`max_retry_count` int NOT NULL DEFAULT '1' COMMENT '最大重试次数',
`next_runtime` datetime NOT NULL DEFAULT '1970-01-01 12:01:01' COMMENT '下次执行时间',
`retry_count` int NOT NULL DEFAULT '0' COMMENT '已重试次数',
`run_rate` int NOT NULL DEFAULT '0' COMMENT '执行频率 单位分钟',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_sup_task_2` (`task_type`) USING BTREE,
KEY `idx_sup_task_3` (`task_keyword`) USING BTREE,
KEY `idx_sup_task_4` (`system_type`, `task_state`, `task_type`)
) ENGINE = InnoDB COMMENT ='任务管理表';

3、RabbitMQ队列:声明一个队列专门用于监听触发任务执行

使用举例

1、声明异步任务类型和对应消费实现

2、业务代码发布异步任务事件

3、异步任务执行