消息服务器工作流程

2018-07-18  本文已影响0人  环零弦

消息服务器工作流程

  1. 消息服务器(Message Server, MS)启动.
    • 启动 WebSocket 服务端,监听来自 BS 的 WebSocket 连接。
  2. 业务服务器(Business Server, BS)启动。
    • BS 作为 WebSocket 客户端,建立其到 MS 的 WebSocket 连接,得到 bsCwsHandle
    • BS 作为 WebSocket 服务端启动,监听来自终端设备的 WebSocket 连接。
  3. 建立 BS 与 MS 之间的 WebSocket 连接。
    • MS 收到来自 BS 的 WebSocket 连接得到 msSwsHandle
    • MS 以随机生成的 UUID 作为此 BS 的 serverId。
    • MS 以形如 <serverId, msSwsHandle> 的映射(swMap)存储此 BS 的 ID 与 WebSocket 句柄。
  4. 建立终端与 BS 之间的 WebSocket 连接。
    • BS 收到来自终端设备的 WebSocket 得到 bsSwsHandle
    • BS 以终端登录用户的 ${ hospitalCode-hosareaCode-uid } 联合键(unionedUid)作为此终端的标识。
    • BS 以形如 <unionedUid, bsSwsHandle> 的映射(uwMap)存储此终端的标识与 WebSocket 句柄。
  5. 完成终端在 MS 处注册终端设备。
    • BS 在与终端建立完成 WebSocket 连接后,将 unionedUid 与传输类型 type=0 通过 bsCwsHandle 发送到 MS。
    • MS 收到来自 BS 的 WebSocket 消息,匹配 type 为 0,则将传来的 unionedUid 与相应的 serverId 存入 MongoDB 的 wsEndMapModel 中,wsEndMapModel 定义如下:
      const wsEndMapModel = mongoConnection.model('wsEndMap', new Schema({
         serverIdentifer: String,
         endIdentifer: String
      }));
      
  6. 发送当前完成注册的终端在 MongoDB 中缓存了的属于它的消息。
    • MongoDB 中维护了一个定义如下的 msgListModel 来存储当目标终端不在线时的消息,生存期为 600 秒。
      const msgListModel = mongoConnection.model('msgList', new Schema({
        endIdentifer: String,
        messageContent: String,
        createAt: {
           type: Date,
           expires: 600,
           default: Date.now
        }
      }));
      
    • 根据 unionedUid 查看缓存中消息,如果有,则根据 MS 中维护的 swMap 获得 当前终端所属 BS 的 msSwsHandle,对其发送查询得到的消息即可。
  7. 终端或 BS 断掉 WebSocket 的处理逻辑。
    • 终端设备中断 WebSocket 连接时,会触发 BS 端的 onclose 事件,可以在事件函数里做以下逻辑。
    • BS 主动中断与终端设备的 WebSocket 连接时,BS 将此设备 unionedUid 与传输类型 type=1 通过 bsCwsHandle 发送到 MS,MS 删除 MongoDB 中 wsEndMapModel 里 endIdentifer 是当前 unionedUid 的文档,代表此终端设备已不在线。
  8. 终端或 BS 发送 WebSocket 的处理逻辑。
    • 终端1(End1)发送消息给终端2(End2) 时,BS1 收到 End1 的消息,BS 将目标设备的 unionedUid 与传输类型 type=2 通过 bsCwsHandle 发送到 MS。
    • MS 查找 wsEndMapModel 中有没有 endIdentifer 是这个 unionedUid 的文档(此终端在线与否),如果找到代表其在线,根据查找到的 serverIdentifer 到 swMap 中拿到这个 BS 对应的 WebSocket 句柄 msSwsHandle,发送具体的消息到这个 BS。
    • 如果没找到,则将这条消息存入 MongoDB 的 msgListModel 中,等待目标终端上线,或者过期清楚。
上一篇下一篇

猜你喜欢

热点阅读