为什么要用异步
在我们平时使用的业务系统中,文件导入和导出是一个很常见的业务需求。正常情况下,同步导出就可以满足我们99.169%的需求。但是对于数据量大,业务拼接复杂的系统来说,导出、导入超时是不可避免的,而且是无法容忍的。异步任务的使用的特点: 处理耗时短、业务优先级低、它能解决导出超时问题,能大大的提高接口请求处理速度,提高吞吐量,提升系统性能!
设计原则
- 降低excel导出时的内存消耗。
- 支持大数据量场景下的excel导出。采用异步导出方式
- 统一excel导出规范。后端导出接口统一化、前端导出交互组件化,简化开发流程
- 封装公共导出方法,管理导出的整个生命周期。接入方只用关心业务逻辑,且代码复用性高
- 文件上传到腾讯云。避免因导出文件过大、导出逻辑耗时过长带来的请求超时等的问题
设计思路
- 公共服务提供统一的提交任务消费者,前端通过统一的接口来导出。统一导出接口会根据导出的url参数转发请求到各业务方的接口实现上
- 公共组件包中提供通用异步导出方法。该方法封装数据写入excel、继承工厂类等逻辑
- 文件上传类,去掉service注解,配置类抽出一个单独的bean供接入发使用
- 导入导出提供统一api
- 大数据量导出的文件划分、支持多种划分策略
- 导出任务内存使用优化,避免大量数据全部load进内存后才开始写入文件
- 定期清理腾讯云文件
- 可在通用导出服务中添加导出审计日志,记录重要敏感数据的导出情况。并且可以添加异常告警等扩展功能。
- 增加过期时间字段,展示到前端,动态生成下载链接
流程图剖析
表设计
CREATE TABLE `yin_cai_task` (0
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`task_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户自定义的任务名称,如果没有则使用方法签名',
`task_status` int NOT NULL DEFAULT '0' COMMENT '执行状态',
`execute_times` int NOT NULL COMMENT '执行次数',
`execute_time` bigint NOT NULL COMMENT '执行时间',
`parameter_types` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数的类路径名称',
`method_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '方法名',
`method_sign_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '方法签名',
`execute_interval_sec` int NOT NULL DEFAULT '60' COMMENT '执行间隔秒',
`delay_time` int NOT NULL DEFAULT '60' COMMENT '延迟时间:单位秒',
`task_parameter` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务参数',
`performance_way` int NOT NULL COMMENT '执行模式:1、立即执行 2、调度执行',
`thread_way` int NOT NULL COMMENT '线程模型 1、异步 2、同步',
`error_msg` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '执行的error信息',
`alert_expression` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '告警表达式',
`alert_action_bean_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '告警逻辑的的执行beanName',
`fallback_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '降级逻辑的的类路径',
`fallback_error_msg` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '降级失败时的错误信息',
`shard_key` bigint DEFAULT '0' COMMENT '任务分片键',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_id_shard_key` (`id`,`shard_key`) USING BTREE
) ENGINE=InnoDB COMMENT='淫才的任务表';
消息队列
- task服务通知业务系统开始执行
- 业务系统通知task任务执行结果