SignalR+Hangfire 實(shí)現(xiàn)后臺(tái)任務(wù)隊(duì)列和實(shí)時(shí)通訊

SignalR+Hangfire 實(shí)現(xiàn)后臺(tái)任務(wù)隊(duì)列和實(shí)時(shí)通訊
1.簡介:
SignalR是一個(gè).NET的開源框架,SignalR可使用Web Socket, Server Sent Events 和 Long Polling作為底層傳輸方式實(shí)現(xiàn)服務(wù)端和客戶端的實(shí)時(shí)數(shù)據(jù)交互。
Hangfire是一個(gè).NET的開源后臺(tái)任務(wù)框架 提供統(tǒng)一的編程模型,以可靠的方式處理后臺(tái)任務(wù)
2.目的:
通過SignalR+Hangfire,我們可以實(shí)現(xiàn)一些需要較長時(shí)間處理的任務(wù),并在完成及時(shí)的通知前端處理結(jié)果。
3.以下是我使用SignalR+Hangfire的開發(fā)需求:
在net6 webapi的情況下,前端是vue+ts,我現(xiàn)在有個(gè)需要就是,我寫了一個(gè)接口,是對接stable diffusion webui 文生圖的接口,前端第一個(gè)人請求,返回圖沒有問題,
但是,此時(shí)在生成圖的過程中,第二個(gè)人請求,我希望加入到一個(gè)隊(duì)列或者別的方式 ,把這個(gè)請求放著,我處理完第一個(gè)請求之后繼續(xù)處理第二個(gè),并且告訴用戶,前面有多少個(gè)任務(wù)需要等待?
我的開發(fā)環(huán)境,后端是.net7 前端vue3.0,下面是對應(yīng)安裝和使用教程:
1.Hangfire使用
1.安裝nuget包
由于我使用的mysql,對應(yīng)包為Hangfire.MySqlStorage,大家根據(jù)自己的數(shù)據(jù)庫選擇安裝對應(yīng)的包
2.添加Hangfire配置
Hangfire的數(shù)據(jù)是存在數(shù)據(jù)庫中的,所以在添加配置時(shí)候要使用對應(yīng)的數(shù)據(jù)庫連接字符串。同時(shí),在UseHangfireServer時(shí),我使用了自定義的隊(duì)列名稱,并將同時(shí)執(zhí)行的任務(wù)數(shù)設(shè)置為1,以實(shí)現(xiàn)任務(wù)隊(duì)列中的任務(wù)唯一,且任務(wù)依次執(zhí)行。
在program.cs中添加以下配置
1.添加Hangfire

代碼內(nèi)容:
2.應(yīng)用Hangfire

代碼內(nèi)容:
3.數(shù)據(jù)庫配置
配置完成,在使用時(shí),數(shù)據(jù)庫會(huì)生成Hangfire的工作表,如下:

4.Hangfire 控制面板
對應(yīng)Hangfire 控制面板為?/hangfire
http://localhost:5122/hangfire
1.儀表盤

2.隊(duì)列

5.代碼中的應(yīng)用
1.發(fā)起一個(gè)后臺(tái)任務(wù)
2.后臺(tái)任務(wù)方法
3.查詢隊(duì)列等待任務(wù)數(shù)
2.SignalR使用
1.后端SignalR使用
由于我使用的.net7,微軟自帶SignalR,我們使用時(shí)只需要添加引用
using Microsoft.AspNetCore.SignalR;
1.添加SignalR配置
在program.cs中添加以下配置
1.添加SignalR

代碼內(nèi)容:
// SignalR
services.AddSignalR();
2.配置SignalR hub

代碼內(nèi)容:
2.創(chuàng)建SignalR hub類
3.代碼中的應(yīng)用
1.依賴注入
通過依賴注入,在要使用的類中注入

2.發(fā)送消息
向全體發(fā)送
向指定客戶端發(fā)送
2.前端SignalR使用
前端我用的是VUE+TS
1.安裝SignalR包
通過命令使用?pnpm
?安裝?@microsoft/signalr
:
2.頁面中引用@microsoft/signalr
3.創(chuàng)建一個(gè)useSignalR.ts
創(chuàng)建一個(gè)useSignalR.ts來專門處理SignalR消息,然后在需要用到的頁面中引用即可。
代碼內(nèi)容:
4.頁面中的使用
在需要使用signalR的頁面引用useSignalR
3.案例:SignalR+Hangfire+StableDiffusionAPI 生成圖片
Hangfire實(shí)現(xiàn)后臺(tái)調(diào)用StableDiffusion web接口,然后通過SignalR將結(jié)果返回給前端。這樣,對StableDiffusion web的性能要求很低。不會(huì)因?yàn)樯蓤D片慢,導(dǎo)致http請求超時(shí)的情況。大大改善了前后端交互。
1.前端建立SignalR
跟上述頁面中使用介紹的一樣,當(dāng)添加了
打開對應(yīng)頁面時(shí),就創(chuàng)建了SignalR的連接了。
2.前端發(fā)起請求
前端的提交按鈕對應(yīng)的方法,使用的是axios發(fā)送http請求生成圖片。
代碼如下:
3.后端接口和實(shí)現(xiàn)
后端接口和實(shí)現(xiàn)方法完成定時(shí)任務(wù)的發(fā)起和signalR的消息推送
后端接口如下:
方法實(shí)現(xiàn):
4.案例成果
案例地址(AI聊天+圖片生成):https://ai.terramours.site/
