消息服務(wù)器工作流程

消息服務(wù)器工作流程

  1. 消息服務(wù)器(Message Server, MS)啟動.
    • 啟動 WebSocket 服務(wù)端,監(jiān)聽來自 BS 的 WebSocket 連接。
  2. 業(yè)務(wù)服務(wù)器(Business Server, BS)啟動。
    • BS 作為 WebSocket 客戶端,建立其到 MS 的 WebSocket 連接,得到 bsCwsHandle
    • BS 作為 WebSocket 服務(wù)端啟動,監(jiān)聽來自終端設(shè)備的 WebSocket 連接。
  3. 建立 BS 與 MS 之間的 WebSocket 連接。
    • MS 收到來自 BS 的 WebSocket 連接得到 msSwsHandle。
    • MS 以隨機生成的 UUID 作為此 BS 的 serverId。
    • MS 以形如 <serverId, msSwsHandle> 的映射(swMap)存儲此 BS 的 ID 與 WebSocket 句柄。
  4. 建立終端與 BS 之間的 WebSocket 連接。
    • BS 收到來自終端設(shè)備的 WebSocket 得到 bsSwsHandle。
    • BS 以終端登錄用戶的 ${ hospitalCode-hosareaCode-uid } 聯(lián)合鍵(unionedUid)作為此終端的標識。
    • BS 以形如 <unionedUid, bsSwsHandle> 的映射(uwMap)存儲此終端的標識與 WebSocket 句柄。
  5. 完成終端在 MS 處注冊終端設(shè)備。
    • BS 在與終端建立完成 WebSocket 連接后,將 unionedUid 與傳輸類型 type=0 通過 bsCwsHandle 發(fā)送到 MS。
    • MS 收到來自 BS 的 WebSocket 消息,匹配 type 為 0,則將傳來的 unionedUid 與相應(yīng)的 serverId 存入 MongoDB 的 wsEndMapModel 中,wsEndMapModel 定義如下:
      const wsEndMapModel = mongoConnection.model('wsEndMap', new Schema({
         serverIdentifer: String,
         endIdentifer: String
      }));
      
  6. 發(fā)送當前完成注冊的終端在 MongoDB 中緩存了的屬于它的消息。
    • MongoDB 中維護了一個定義如下的 msgListModel 來存儲當目標終端不在線時的消息,生存期為 600 秒。
      const msgListModel = mongoConnection.model('msgList', new Schema({
        endIdentifer: String,
        messageContent: String,
        createAt: {
           type: Date,
           expires: 600,
           default: Date.now
        }
      }));
      
    • 根據(jù) unionedUid 查看緩存中消息,如果有,則根據(jù) MS 中維護的 swMap 獲得 當前終端所屬 BS 的 msSwsHandle,對其發(fā)送查詢得到的消息即可。
  7. 終端或 BS 斷掉 WebSocket 的處理邏輯。
    • 終端設(shè)備中斷 WebSocket 連接時,會觸發(fā) BS 端的 onclose 事件,可以在事件函數(shù)里做以下邏輯。
    • BS 主動中斷與終端設(shè)備的 WebSocket 連接時,BS 將此設(shè)備 unionedUid 與傳輸類型 type=1 通過 bsCwsHandle 發(fā)送到 MS,MS 刪除 MongoDB 中 wsEndMapModel 里 endIdentifer 是當前 unionedUid 的文檔,代表此終端設(shè)備已不在線。
  8. 終端或 BS 發(fā)送 WebSocket 的處理邏輯。
    • 終端1(End1)發(fā)送消息給終端2(End2) 時,BS1 收到 End1 的消息,BS 將目標設(shè)備的 unionedUid 與傳輸類型 type=2 通過 bsCwsHandle 發(fā)送到 MS。
    • MS 查找 wsEndMapModel 中有沒有 endIdentifer 是這個 unionedUid 的文檔(此終端在線與否),如果找到代表其在線,根據(jù)查找到的 serverIdentifer 到 swMap 中拿到這個 BS 對應(yīng)的 WebSocket 句柄 msSwsHandle,發(fā)送具體的消息到這個 BS。
    • 如果沒找到,則將這條消息存入 MongoDB 的 msgListModel 中,等待目標終端上線,或者過期清楚。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容