背景
实际业务研发中,存在需要异步执行、或者延时执行某些操作,且这些操作支持重试,需要一个异步延时任务来支撑
方案设计
方案组合:Mysql持久化 + RabbitMQ异步解耦 + 定时任务定时轮询
1、状态流转图
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、异步任务执行