[SignalR] 06 - Scale Out with Redis

為了要嘗試多台主機的情況,改採用 Redis 來做

先前的練習專案也有許多小地方錯誤,不過反正是練習,也就沒打算修正;這次重新開一個練習專案,比較乾淨

signalr service project

首先用 nuget 安裝 Microsoft.AspNet.SignalR.Redis,並在 startup.cs 加入下列指令

1
2
3
4
5
6
7
8
9
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 使用redis scale out
GlobalHost.DependencyResolver.UseRedis("127.0.0.1", 6380, null, "signalr-chat");
app.MapSignalR();
}
}

建立 docker redis

雖然有 windows 版本,不過嘗試了一下好像無法執行redis-cli,所以還是用 docker 來練習

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# get docker image
docker pull redis

# run redis image
docker run -p 6380:6379 --name signalr-redis -d redis

# connect to redis via redis-cli
docker exec -it signalr-redis redis-cli

# 查詢目前有哪些頻道可訂閱
pubsub channels

# 查詢有幾個 Web 站台訂閱了 Redis 的頻道
pubsub numsub chat

這次的練習大致上困難點只是在架設 redis,搞定都過了一下午了,原本想利用pubsub numsub chat去抓出有多少個人訂閱了該頻道,後來才想到這邊的數字應該指的是誰跟 redis 訂閱,那當然就是 web 站台了…不信的人自己可以 deploy 到 local IIS 玩一下,站台啟動跟站台停止,查看一下 pubsub numsub chat 的回應

怎麼取得線上人數這件事情,似乎真的要自己在連線的那堆事件裡硬幹了…

調整幅度有點大,細節不說了,重點節錄:

  1. 僅使用最基礎的字串 key-value pair,透過序列化、反序列化運用
  2. 連線、斷線、重連事件內先處理各項資料的 DTO 再丟去更新 cache
  3. Console 專案連線位置須注意是跟著 Web 走,需要可自行調整 ( Ref:文章 )
  4. 個人資料用來記錄使用者 ID 與該使用者的 ConnectionId,主要是為了密語功能
  5. 在線人數用來顯示總人數、及哪一個人有幾個 ConnectionId
  6. 原先用 HTML 改為 MVC,沒什麼特殊意義,隨手改的
  7. Redis 各項指令須注意時間複雜度
  8. SignalR 服務端掛掉、重新佈署,會導致無法觸發到 OnDisconnected()事件,後果就是 Cache 數據會不正確,解決方案聽說有 LoadBanlance、官網介紹是說用 Job 處理掉無效資料


附上練習程式碼