業務需求
- 人-專案關系
一個人可以屬于多個專案,一個專案可以有多個人加入,通知的時候,可以通知專案內的所有人,也可以通知部分人或者某個責任人, - 登錄互斥
同一個人不允許登錄兩次(不同瀏覽器或者不同電腦登),后面登錄的會將前面登錄的人擠下線, - 聊天
可以私聊、也可以創建群聊、上線通知(多個連接的情況) - 檔案下載
用戶在界面上選擇了多個檔案,然后選擇批量打包下載,后端后臺執行緒進行壓縮、壓縮完成后通過signalr通知該用戶(的某個連接,比如當前用戶開了多個tab頁,應該只能推送給操作的那個tab頁)
功能設計
名詞解釋: 業務系統:具體業務功能的系統 推送系統:實際的Signalr系統,跟業務系統分開部署
- 將推送單獨成一個子系統;支持單獨部署,可一臺服務器也可以多臺,通過redis作為底板來分發到服務器
- 推送子系統端自定義管理用戶、連接、組,業務系統呼叫的時候
- 推送系統開發一個api,給業務系統直接呼叫(當然這不是最佳選擇,可以通過訊息佇列,支持重試、優先級等,性能會比http形式好很多)
業務系統呼叫推送系統的時候傳遞引數包括,組、用戶、推送資料物件,比如如下代碼
var send = new Send()
{
// 推送的組,多個用,隔開
GroupId = GroupId,
// 關聯的UserId 多個用,隔開
UserIds= UserIds,
// 是否排除用戶
ExcludeUsers=ExcludeUsers,
// 實際推送的物件
NotifyObj = new NotifyObj()
{
Data = https://www.cnblogs.com/xiexingen/p/Data,
NotifyType = NotifyType,
OpType= OpType
},
};
-
有GroupId
-
ExcludeUsers=true
推送給指定的組中所有用戶(排除掉UserIds部分) -
ExcludeUsers=false
推送給組中指定(UserIds中指定的)的這些用戶
-
-
無GroupId
-
ExcludeUsers=true
推送給當前所有連接(排除掉UserIds部分的用戶) -
ExcludeUsers=false
推送給指定用戶(UserIds中指定的用戶)
-
架構設計
- 組、用戶、連接的關系
- 用戶:[連接Id]
一個用戶用多個連接、以Set形式存redis中 - 組:[連接Id:用戶Id]
以Redis中的Hash格式存盤,以Group為Key,以連接Id為Name,以UserId為值,一個用戶在組中可能多個連接(開多個瀏覽器tab頁),這樣設計的好處是可以滿足以下的幾種情況- 給某個人推送
從redis中直接根據該用戶的UserId查詢該用戶的所有連接,然后通過連接推送即可 - 給某個組推送
從redis中根據組名查詢出所有的連接Id,通過連接直接推送 - 給某個組中的某些人推
這個時候不能根據人查連接Id,需要先根據組得到組中的人、連接Id,然后只給組中這些人對應的連接推送 - 用戶上線的時候
在redis中存盤一份用戶與連接的關系;如果有組的情況,同時以Hash形式存盤組、連接Id、用戶Id - 用戶再開一個瀏覽器tab頁
在redis中該用戶對應的連接中增加新的連接Id;如果有組的情況,同時以Hash形式存盤組、連接Id、用戶Id(因為是一連接Id為name的,然而連接Id是不重復的,所以是可以存著同一個組、同一個用戶不同連接這種情況的) - 用戶退出頁面
在redis中找到該用戶,從redis中洗掉改用戶的找個連接Id,組的情況同樣處理 - 給某個用戶的某個連接Id推送
比如:用戶點擊打包下載,服務器端后臺執行緒進行打包、壓縮,完成后推送給指定的連接Id,前端界面再進行處理下載
- 給某個人推送
至此,業務分析完畢,更多內容請通過快速導航查看下一篇
快速導航
| 標題 | 內容 |
|---|---|
| 索引 | .net core 3.0 Signalr - 實作一個業務推送系統 |
| 上一篇 | .net core 3.0 Signalr - 05 使用jwt將用戶跟signalr關聯 |
| 下一篇 | .net core 3.0 Signalr - 07 業務實作-服務端 自定義管理組、用戶、連接 |
| 原始碼地址 | 原始碼 |
| 官方檔案 | 官方檔案 |

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/110622.html
標籤:.NET Core
