im设计
IM-server服务端:
1、用于接收 Client 连接、消息推送等功能。支持集群部署。
2、检测客户端存活状态,心跳时间为300秒/500秒,心跳过快耗电过多,心跳过慢有可能被电信运营商切断连接
3、设备/用户登录退出操作,更新Redis中的状态
4、消息进行双向确认/重传/去重。发送消息后,客户端必须回复ACK确认包,才认为已成功。否则进行重传,客户端对服务器推送的消息进行去重,避免收到重复的消息。
2、Route消息路由服务器:
1、检测IM-server的存活状态
2、支持权限认证
3、根据服务器的状态,按照一定的算法,计算出该客户端连接到哪台IM-server,返回给客户端 ,客户端再去连接到对应的服务端。
4、如果 IM-server宕机,会自动从Redis中当中剔除
5、IM-server上线后连接到Route,自动加 入Redis
6、可以接受来自PHP代码、C++程序、Java程序的消息请求,转发给用户所在的IM-server
3、Client客户端
1、消息通讯,及消息应答ack
2、心跳保持及断开重连
流程图:
整体的流程也比较简单,流程图如下:
1、客户端向 Route 发起登录。
2、登录成功从 redis当中选择可用 im-server 返回给客户端,并保存登录、路由信息到 Redis。
3、客户端向 im-server 发起长连接,成功后保持心跳。
4、客户端下线时清除状态信息。