美文网首页
消息服务器工作流程

消息服务器工作流程

作者: 环零弦 | 来源:发表于2018-07-18 16:06 被阅读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 中,等待目标终端上线,或者过期清楚。

    相关文章

      网友评论

          本文标题:消息服务器工作流程

          本文链接:https://www.haomeiwen.com/subject/hyaopftx.html