爲什麼要用異步
在我們平時使用的業務系統中,文件導入和導出是一個很常見的業務需求。正常情況下,同步導出就可以滿足我們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任務執行結果