消息服务器工作流程
2018-07-18 本文已影响0人
环零弦
消息服务器工作流程
- 消息服务器(Message Server, MS)启动.
- 启动 WebSocket 服务端,监听来自 BS 的 WebSocket 连接。
- 业务服务器(Business Server, BS)启动。
- BS 作为 WebSocket 客户端,建立其到 MS 的 WebSocket 连接,得到 bsCwsHandle。
- BS 作为 WebSocket 服务端启动,监听来自终端设备的 WebSocket 连接。
- 建立 BS 与 MS 之间的 WebSocket 连接。
- MS 收到来自 BS 的 WebSocket 连接得到 msSwsHandle。
- MS 以随机生成的 UUID 作为此 BS 的 serverId。
- MS 以形如 <serverId, msSwsHandle> 的映射(swMap)存储此 BS 的 ID 与 WebSocket 句柄。
- 建立终端与 BS 之间的 WebSocket 连接。
- BS 收到来自终端设备的 WebSocket 得到 bsSwsHandle。
- BS 以终端登录用户的 ${ hospitalCode-hosareaCode-uid } 联合键(unionedUid)作为此终端的标识。
- BS 以形如 <unionedUid, bsSwsHandle> 的映射(uwMap)存储此终端的标识与 WebSocket 句柄。
- 完成终端在 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 }));
- 发送当前完成注册的终端在 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,对其发送查询得到的消息即可。
- MongoDB 中维护了一个定义如下的 msgListModel 来存储当目标终端不在线时的消息,生存期为 600 秒。
- 终端或 BS 断掉 WebSocket 的处理逻辑。
- 终端设备中断 WebSocket 连接时,会触发 BS 端的 onclose 事件,可以在事件函数里做以下逻辑。
- BS 主动中断与终端设备的 WebSocket 连接时,BS 将此设备 unionedUid 与传输类型 type=1 通过 bsCwsHandle 发送到 MS,MS 删除 MongoDB 中 wsEndMapModel 里 endIdentifer 是当前 unionedUid 的文档,代表此终端设备已不在线。
- 终端或 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 中,等待目标终端上线,或者过期清楚。