Swoole手工打造IM通讯服务器案例

1. IM通讯服务器案例分析

1.1 需求分析

        本案例是通过在建项目为原型,主要通过设计搭建一个IM通讯服务器做案例,抽取核心的逻辑,旨在更好的掌握设计良好、高性能的IM通信服务器的原理,为今后的项目开发及应用积累更多的经验素材。

        QQ,Msn等都是IM通信服务器经典软件。要搭建一个这样的类似IM服务器,需要承载大量的客户端要向IM服务器发送通信请求,必然要考虑到高并发、多线程等网络通讯处理,实现消息广播通信、私聊通信、离线消息暂存收发,用户在线状况、离线状况展示等。

        设计上我们要考虑如下

        1)需要更多的IM服务器提供通讯,并做到负载均衡,如何统一管理多个IM服务器负载,我们抽象出一个路由层,包含路由服务器Route Server,来统一接受客户端的请求,验证合法性,再分发给IM服务器,根据IM负载情况、按一定算法提供给客户端一个可用的IM服务器,每个IM服务器都统一在Route server注册服务。那么路由层充当一个中间层,作为一个注册中心,接收请求,发现/注册。

       2)为提高通讯数据传输的性能,我们提供高效的缓存服务器Redis,保存应用中的路由数据、注册数据等。

       3)IM服务器可能会断线,为防止数据丢失,IM服务器向路由层发起心跳检测,路由层接收消息后,根据心跳检测结果,若无心跳,缓存服务器清理IM服务器的处理,保证向客户端提供可用的IM服务器。

 

1.2 架构设计

框架整体主要由以下模块组成:
1、IM-server服务端:
    1)用于接收 Client 连接、消息推送等功能。支持集群部署;
    2)检测客户端存活状态,心跳时间为300秒/500秒,心跳过快耗电过多,心跳过慢有可能被电信运营商切断连接;
   3)设备/用户登录退出操作,更新Redis中的状态;
   4)消息进行双向确认/重传/去重。发送消息后,客户端必须回复ACK确认包,才认为已成功。否则进行重传,客户端对服务器推送的消息进行去重,避免收到重复的消息。

2、Route消息路由服务器:
   1)检测IM-server的存活状态;

   2)支持权限认证;

   3)根据服务器的状态,按照一定的算法,计算出该客户端连接到哪台IM-server,返回给客户端,客户端再去连接到对应的服务端,保存客户端与IM-server的路由关系;

   4)如果 IM-server宕机,会自动从Redis中当中剔除;

   5)IM-server上线后连接到Route,自动加 入Redis;

   6)可以接受来自PHP代码、C++程序、Java程序的消息请求,转发给用户所在的IM-server;
   7)缓存服务器地址,多次查询redis;
3、Client客户端
   1)消息通讯,及消息应答ack;
   2)心跳保持及断开重连;

1.2 IM通信服务流程框架

整体的流程如上图:

1、客户端向 Route 发起登录。

2、登录成功从 redis当中选择可用 IM-server 返回给客户端,并保存登录、路由信息到 Redis。

3、客户端向 im-server 发起长连接,成功后保持心跳。

4、客户端下线时清除状态信息。

2. IM通讯服务器实现

2.1 实现原理流程图

         IM服务器的注册与发现、以及消息路由。路由器负责接入客户端请求,认证并发放令牌,同时选择可用的IM服务器,注册和销毁服务器在线状态,为客户端请求接入连线IM服务器。
 

持续完善,待续...

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云焰

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值