利用 SQL Server 作業實現異步任務處理,簡化系統架構

在現代企業系統中,異步任務是不可或缺的組成部分,例如:

  • 電商系統中的訂單超時取消;

  • 報表系統中的異步數據導出;

  • CRM 系統中的客戶積分計算。

傳統的實現方式通常涉及引入消息隊列(如 RabbitMQ、Kafka)或任務調度系統(如 Hangfire、Quartz),這些系統雖然功能強大,但對中小項目而言,引入成本、維護復雜度和部署依賴顯著增加。

本文將介紹一種輕量級但可靠的方案:利用 SQL Server 自帶的“作業”(Job)機制充當異步任務執行器,在不引入額外組件的前提下,實現任務分發、執行、失敗重試與自動清理。


一、為什么選擇 SQL Server 作業機制?

SQL Server 自帶的 SQL Server Agent 是一個成熟的作業調度與管理組件,提供如下能力:

功能描述
任務異步執行支持延遲執行和立即觸發
獨立進程管理與主業務系統解耦,不影響事務
執行日志與錯誤捕獲內建錯誤追蹤,便于排查
自動刪除作業可根據業務邏輯動態清理
安全與權限控制遵循 SQL Server 安全模型

使用 SQL Server 作業,我們可以將任務調度與處理“內聚”到數據庫層,避免引入額外微服務組件,降低部署運維復雜度


二、設計理念:一次性任務 + 自動清理

核心思路:

  1. 每個異步任務對應一個 SQL Server 作業

  2. 作業執行后:

    • 成功則自動刪除自身

    • 失敗則保留作業供排查,并記錄錯誤日志;

  3. 所有任務入口統一調用一個“任務包裝器存儲過程”,實現標準化調度邏輯。

這種設計既保證了任務執行的可靠性,又控制了系統負擔,適合高并發但單任務耗時較短的場景。


三、示例實現

1. 異步任務包裝器 proc_async_wrapper

CREATE PROCEDURE proc_async_wrapper@task_name NVARCHAR(200),@handler_proc NVARCHAR(200),@handler_param NVARCHAR(200)
AS
BEGINDECLARE @sql NVARCHAR(MAX), @msg NVARCHAR(MAX);BEGIN TRY-- 拼接目標任務執行語句SET @sql = 'EXEC ' + QUOTENAME(@handler_proc) + ' ' + QUOTENAME(@handler_param, '''');EXEC sp_executesql @sql;-- 成功后記錄日志并刪除作業INSERT INTO async_task_logs(task_name, status, message)VALUES (@task_name, 'success', '執行成功');EXEC msdb.dbo.sp_delete_job @job_name = @task_name;END TRYBEGIN CATCHSET @msg = ERROR_MESSAGE();INSERT INTO async_task_logs(task_name, status, message)VALUES (@task_name, 'failed', @msg);-- 不刪除作業,保留失敗記錄以供排查END CATCH
END

2. 任務日志表

CREATE TABLE async_task_logs (id BIGINT IDENTITY PRIMARY KEY,task_name NVARCHAR(200),status VARCHAR(20), -- success / failedmessage NVARCHAR(MAX),created_at DATETIME DEFAULT GETDATE()
);

3. 動態創建作業的存儲過程

CREATE PROCEDURE proc_create_async_task@task_name NVARCHAR(200),@handler_proc NVARCHAR(200),@handler_param NVARCHAR(200)
AS
BEGINDECLARE @cmd NVARCHAR(MAX);SET @cmd = 'EXEC proc_async_wrapper ' +'''' + @task_name + ''', ' +'''' + @handler_proc + ''', ' +'''' + @handler_param + '''';EXEC msdb.dbo.sp_add_job @job_name = @task_name;EXEC msdb.dbo.sp_add_jobstep @job_name = @task_name, @step_name = N'Step1',@subsystem = N'TSQL', @command = @cmd, @database_name = N'你的數據庫名';EXEC msdb.dbo.sp_add_jobserver @job_name = @task_name;EXEC msdb.dbo.sp_start_job @job_name = @task_name;
END

四、使用場景與案例

? 適合場景:

  • 中小型系統的異步處理;

  • 多租戶 SaaS 系統中租戶級任務;

  • 數據遷移或批量處理任務;

  • 報表導出、緩存預熱、通知發送等后臺作業。

? 使用示例:

EXEC proc_create_async_task @task_name = 'AsyncTask_GenerateReport_20250520143000',@handler_proc = 'proc_generate_report',@handler_param = 'report_202505';

五、擴展建議

  • 失敗任務通知:可構建定時作業檢查失敗記錄并發送報警;

  • 任務重試機制:支持將失敗任務重新注冊到 Agent 中;

  • 隊列式執行:通過維護任務表 + 定時 Job,實現類消息隊列模型;

  • 權限安全性:設置只讀賬戶,限制外部創建作業權限;


六、總結:輕量、內聚、可控

使用 SQL Server 作業機制作為異步處理引擎,提供了以下優勢:

  • 部署簡單:無需引入消息隊列或異步框架;

  • 內聚架構:所有任務邏輯封裝在數據庫中,便于集中管理;

  • 任務隔離:每個任務獨立,互不影響;

  • 自清理機制:成功即刪,失敗可追蹤。

該方案特別適合中小型系統、資源有限場景,或對系統組件數量有控制要求的架構中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83914.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu sh安裝包的安裝方式

ubuntu sh安裝包的安裝方式以Miniconda2為例 https://repo.anaconda.com/miniconda/ 如果需要python2.7版本可下載以下版本 Miniconda2-latest-Linux-x86_64.sh 打開終端輸入安裝命令 sudo sh Miniconda2-latest-Linux-x86_64.sh 然后按提示安裝,注意安裝位置 …

gRPC開發指南:Visual Studio 2022 + Vcpkg + Windows全流程配置

前言 gRPC作為Google開源的高性能RPC框架,在微服務架構中扮演著重要角色。本文將詳細介紹在Windows平臺下,使用Visual Studio 2022和Vcpkg進行gRPC開發的完整流程,包括環境配置、項目搭建、常見問題解決等實用內容。 環境準備 1. 安裝必要組…

C#控制流

🧩 一、控制流概述 C# 中的控制流語句用于根據條件或循環執行代碼塊。它們是程序邏輯的核心部分。 ? 二、1. if、else if、else int score 85;if (score > 90) {Console.WriteLine("優秀"); } else if (score > 60) {Console.WriteLine("及…

你知道mysql的索引下推么?

在此之前,需要先明白mysql內部的一個大致結構,mysql內部大概是劃分為3處,client客戶端連接,server層,存儲引擎層 索引下推是mysql5.6之后內部的一種索引優化手段。 比如現在我有一張表student表,字段有id&…

mysql的基礎命令

1.SQL的基本概念 SQL 是用于管理和操作關系型數據庫的標準編程語言。是所有關系型數據庫(如 MySQL、PostgreSQL、Oracle 等)的通用語言。 SQL語句分類 DDL: Data Defination Language 數據定義語言 CREATE,DROP,ALTER DML: Da…

Python爬蟲實戰:研究加密參數的定位方法,實現逆向解密

一、引言 在數字化信息時代,網絡數據成為重要的戰略資源。Python 以其簡潔的語法和豐富的庫生態,成為網絡爬蟲開發的首選語言。然而,隨著互聯網安全防護意識的增強,網站普遍采用加密技術保護數據接口,如請求參數加密、會話驗證、動態令牌等,這使得傳統爬蟲技術面臨巨大挑…

軸承表面缺陷檢測數據集VOC+YOLO格式3945張3類別

數據集格式:Pascal VOC格式YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數):3945 標注數量(xml文件個數):3945 標注數量(txt文件個數):3945 標注…

【51單片機中斷】

目錄 配置流程 1.在IE寄存器中開啟總中斷通道和需要的某中斷通道 2.在TCON寄存器開啟所用中斷的觸發方式 3.使用中斷函數完成中斷 4.若需要中斷嵌套則在IP寄存器中配置 5.若需要使用串口的中斷,則配置SCON寄存器 6.代碼示例 配置流程 1.在IE寄存器中開啟總…

【機器學習】Anaconda安裝后打不開jupyter notebook(網頁不自動跳出)

文章目錄 一、遇到的問題:jupyter notebook網頁不自動跳出(一)輸入jupyter notebook命令(二)手動打開網頁 二、解決辦法:指定瀏覽器(一)找文件 jupyter_notebook_config.py&#xff…

數字格式化庫 accounting.js的使用說明

accounting.js 是一個用于格式化數字、貨幣和金額的輕量級庫,特別適合財務和會計應用。以下是其詳細使用說明: 安裝與引入 通過 npm 安裝: bash 復制 下載 npm install accounting 引入: javascript 復制 下載 const accounting …

DeepSpeed簡介及加速模型訓練

DeepSpeed是由微軟開發的開源深度學習優化框架,專注于大規模模型的高效訓練與推理。其核心目標是通過系統級優化技術降低顯存占用、提升計算效率,并支持千億級參數的模型訓練。 官網鏈接:deepspeed 訓練代碼下載:git代碼 一、De…

集星獺 | 重塑集成體驗:新版編排重構仿真電商訂單數據入庫

概要介紹 新版服務編排以可視化模式驅動電商訂單入庫流程升級,實現訂單、客戶、庫存、發票、發貨等環節的自動化處理。流程中通過循環節點、判斷邏輯與數據查詢的編排,完成了低代碼構建業務邏輯,極大提升訂單處理效率與業務響應速度。 背景…

AMO——下層RL與上層模仿相結合的自適應運動優化:讓人形行走操作(loco-manipulation)兼顧可行性和動力學約束

前言 自從去年24年Q4,我司「七月在線」側重具身智能的場景落地與定制開發之后 去年Q4,每個月都會進來新的具身需求今年Q1,則每周都會進來新的具身需求Q2的本月起,一周不止一個需求 特別是本周,幾乎每天都有國企、央企…

MATLAB中進行語音信號分析

在MATLAB中進行語音信號分析是一個涉及多個步驟的過程,包括時域和頻域分析、加窗、降噪濾波、端點檢測以及特征提取等。 1. 加載和預覽語音信號 首先,你需要加載一個語音信號文件。MATLAB支持多種音頻文件格式,如.wav。 [y, fs] audiorea…

JWT令牌驗證

一、JWT 驗證方式詳解 JWT(JSON Web Token)的驗證核心是確保令牌未被篡改且符合業務規則,主要分為以下步驟: 1. 令牌解析與基礎校驗 收到客戶端傳遞的 JWT 后,首先按 . 分割為三部分:Header、Payload、S…

一文講清python、anaconda的安裝以及pycharm創建工程

軟件下載 Pycharm下載地址: Other Versions - PyCharm anaconda下載地址: https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Windows-x86_64.exe 安裝步驟 一、 Python 解釋器的安裝步驟 安裝目錄介紹: 二、 Anaconda 安裝 2.1 安裝步…

Mac如何允許安裝任何來源軟件?

打開系統偏好設置-安全性與隱私,點擊右下角的解鎖按鈕,選擇允許從任何來源。 如果沒有這一選項,請到打開終端,輸入命令行:sudo spctl --master-disable, 輸入命令后回車,輸入電腦的開機密碼后回車。 返回“…

React Flow 中 Minimap 與 Controls 組件使用指南:交互式小地圖與視口控制定制(含代碼示例)

本文為《React Agent:從零開始構建 AI 智能體》專欄系列文章。 專欄地址:https://blog.csdn.net/suiyingy/category_12933485.html。項目地址:https://gitee.com/fgai/react-agent(含完整代碼示?例與實戰源)。完整介紹…

Windows Ubuntu 目錄映射關系

情況一:你是通過 WSL (Windows Subsystem for Linux) 安裝 Ubuntu 這是最常見的情況。如果你在 Microsoft Store 安裝了 “Ubuntu”,默認就是 WSL。 📁 目錄映射關系如下: 從 Ubuntu(WSL)訪問 Windows&…

雙指針法高效解決「移除元素」問題

雙指針法高效解決「移除元素」問題 雙指針法高效解決「移除元素」問題一、問題描述二、解法解析:雙指針法1. 核心思想2. 算法步驟3. 執行過程示例 三、關鍵點分析四、復雜度分析五、與其他解法的比較1. 快慢指針法2. 本解法的優勢 六、實際應用場景七、總結 雙指針法…