伊莉討論區

標題: C# SignalR2 聊天室 [打印本頁]

作者: ggnnyy    時間: 2017-11-13 04:57 PM     標題: C# SignalR2 聊天室

各位大大好:
最近想用SignalR2實作一個聊天室,外表就像LINE那樣有一個使用者清單,點擊使用者之後可以進行一對一的對話,
聊天的部分沒什麼問題,不過我想實現的是要加上未讀訊息則數的提醒。
想請各位大大提供一些想法或概念!!!
EX.如果配合資料庫做運算的話,那每一次有新訊息時就要計算當前使用者與所有其他的使用者的最後一筆讀取和最後一筆新增的差異數,這樣感覺很耗資源...

作者: sam30525sam    時間: 2017-11-19 08:35 PM

這個還滿簡單的,
主要分成兩個行為
1. 取得使用者資料
2. 接收訊息新增

1. 取得使用者資料
這個可以在使用者登入的時候,就從DB拉一次就好,
取得使用者尚未讀取信件數

2. 接收訊息新增
signalR接收到,直接在現在的數量+1就好,不用去DB撈
雖然會導致數量不太正確,但大多數情況都是正確的

作者: ggnnyy    時間: 2017-11-20 08:59 PM

sam30525sam 發表於 2017-11-19 08:35 PM
這個還滿簡單的,
主要分成兩個行為
1. 取得使用者資料

那請問sam大,再登入的時候從DB拉一次就好這部分,
有什麼方法去判別登入的使用者,與其他使用者的未讀信件數?
我想的方法是只要我開啟我和某A使用者的對話視窗時,那我就會插入一筆資料進DB,
內容記錄欄位有 <對話ID,我,對象,某分割用的符號>,這樣用來記錄我檢視和某A對話的最後一筆,
之後重新進入系統再根據我和每個使用者的最後一筆紀錄來計算未讀訊息數,
不知道這個方向對不對??
作者: sam30525sam    時間: 2017-11-20 11:15 PM

ggnnyy 發表於 2017-11-20 08:59 PM
那請問sam大,再登入的時候從DB拉一次就好這部分,
有什麼方法去判別登入的使用者,與其他使用者的未讀信 ...

登入跟未登入玩家不應該用DB來處理,
請用session處理。

session也分兩種,
一種是該IIS的session,
這個就是一個站台一個session。

另一種是有session意義的資料,
這種session都會往後放,但請不要放DB,
可以達到平行擴充的效果

正常來講,第一種,普通的session就夠用了
作者: sheauren    時間: 2017-12-1 06:04 AM

看你的聊天室concurrent user有多少人
如果500以內的話db取得未讀取的訊息量還撐得住
不過記得要with nolock select
signalr的scaleout也是透過db 所以真的考慮scaleout的話
server端的write/read這兩段要切漂亮一點
read部分需要session跟db結合來提升效能 可能加掛一個nosql db(key-value)會更有幫助
另外signalr資料傳輸太複雜或者太密集也會有點問題
所以建議即時反應的資料以外都繞開signalr(例如直接http get)
不然signalr會撐不住
作者: kevinkao809    時間: 2018-1-1 04:34 PM

"signalr會撐不住" ??? 可以透過 Redis Cache 來建置 Clustering 的 SignalR.




歡迎光臨 伊莉討論區 (http://www01.eyny.com/) Powered by Discuz!