本篇将带大家从零开始搭建一个轻量级的IM服务端,麻雀虽小,五脏俱全,我们搭建的IM服务端实现以下功能:
如上图IM电竞,我们现在有两个用户:Alice和Bob连接到了服务器,当Alice发送消息message(hello)给Bob,服务端接收到消息im资讯,根据消息的destId进行转发,转发给Bob。
我们定义一种回执数据格式ACK,MsgType有三种,分别是sent(已发送),delivered(已送达), read(已读):
1.向Alice发送一个sent(hello)表示消息已经被发送到服务器。IM电竞
3.Bob阅读消息后,客户端向服务器发送read(hello)表示消息已读
在服务器这里不区分ChatMsg和AckMsg,处理过程都是一样的:解析消息的destId并进行转发。
当用户量越来越大,必然需要增加服务器的数量,用户的连接被分散在不同的机器上。此时,就需要存储用户连接在哪台机器上。
这样我们就能够对用户连接状态进行管理了,具体的实现应考虑服务的用户量、期望性能等进行实现。
此时我们的服务被拆分成了connector和transfer两个模块,connector模块用于维持用户的长链接,IM电竞而transfer的作用是将消息在多个connector之间转发。
现在Alice和Bob连接到了两台connector上,那么消息要如何传递呢?
引入user status模块管理用户连接,transfer模块在不同的机器之间转发,使服务可以水平扩展。
为了满足实时转发,transfer需要和每台connector机器都保持长链接IM电竞。
如果用户当前不在线IM电竞,IM电竞就必须把消息持久化下来,等待用户下次上线再推送,这里使用mysql存储离线消息。