1. 程式人生 > >思考(四十四):一種全服郵件的實現方法

思考(四十四):一種全服郵件的實現方法

背景假設

  • 考慮到大量玩家線上、以及更多未線上玩家
  • 並假設邏輯服是可以多開的

本文術語

  • GMTool

    能夠傳送 全服郵件 的客戶端

  • GMServer

    給 GMTool 提供服務的伺服器程式

  • LogicServer

    處理遊戲客戶端邏輯的伺服器程式

實現

下面分幾個步驟說明:

一、觸發 全服郵件 邏輯

有 2 種情況:

  • LogicServer 執行中
GMToolGMServerRedisLogicServer1. 傳送一封 `全服郵件`2. 檢查刪除過期 `全服郵件`2. 儲存這封 `全服郵件`3. 通知 `全服郵件` 到達3. 通知 `全服郵件` 到達3. 維護 `全服郵件`
列表3. 觸發處理`全服郵件` 邏輯GMToolGMServerRedisLogicServer
  • LogicServer 啟動時
LogicServerRedis1. 獲取 `全服郵件` 列表1. 返回 `全服郵件` 列表1. 本地刪除過期`全服郵件`2. 通知 `全服郵件` 到達3. 維護 `全服郵件`列表3. 觸發處理`全服郵件` 邏輯LogicServerRedis

二、全服郵件 傳送佇列

有 2 種情況:

  • 離線玩家登入
ClientLogicServerRedis1. 玩家登入邏輯處理(略)1. 獲取玩家接收過 `全服郵件` ID 列表1. 返回該玩家接收過 `全服郵件` ID 列表
2. 依次檢查該玩家是否已接收過`全服郵件`列表中的郵件3.如果未接收過,加入該`全服郵件`傳送佇列ClientLogicServerRedis
  • 線上玩家
LogicServer1. 通知 `全服郵件` 到達2. 檢查該玩家是否已接收過該郵件3.如果未接收過,加入該`全服郵件`傳送佇列LogicServer

三、處理 全服郵件 傳送佇列

單個玩家全服郵件傳送邏輯,實現如下:

ClientLogicServerRedis1. `全服郵件` 傳送佇列中取出一個玩家2. 觸發傳送玩家郵件邏輯處理2. 儲存玩家郵件2. 返回儲存結果3. 維護該玩家接收過 `全服郵件` ID 列表4. 通知新郵件到達
ClientLogicServerRedis

四、全服郵件 傳送佇列處理頻率

處理頻率主要約束條件是 Redis 的處理能力。

部署 Redis 的機器效能、 Redis 的部署方式是否叢集化等,都會執行影響 處理頻率。

下面分析下單 Redis 情況:

假設:

  • 每次處理 10 個玩家
  • 每次處理時間間隔 25ms
  • Redis 每秒處理 10w 次儲存操作

則:

  • LogicServer 線上 4000 玩家, 10 秒傳送完畢
  • 單 Redis 支援 100 萬玩家線上,需要開 250 臺 LogicServer,並在 10 秒傳送完畢