服务端分层模型 - 图1

宏观上来看, IM系统架构分为

  • 接入层
  • 路由层
  • 逻辑层
  • 存储层

1. 接入层

接入层最基础最重要的任务就是: 与客户端保持连接
通过少量的服务器, 就可以提供高质量高并发的TCP长连接能力

主要功能:

  1. 连接整流
  • 将大量的TCP长连接, 转换成少量的服务端TCP连接
  • 保护其他模块不被大量连接冲击
  1. 安全信道
  • 协商秘钥, 建立安全信道
  • 加解密
  • 压缩解压缩
  1. 初步攻防
  • 与业务无关的一些攻防策略
  • 连接频率控制
  • 发包速率控制(发得流量很大)
  • 发包频率控制(发得很快)
  • IP黑白名单
  • 等等其他功能

2. 路由层

接入层 与 路由层之间只需要少量的TCP连接, 就可以由很高的通信效率

路由分两种:

  1. 客户端发送消息

路由层负责找到逻辑层哪个服务处理客户端的消息
服务端分层模型 - 图2

  1. 服务端发送消息

路由层负责找到客户端的TCP连接在哪个接入层服务器上
服务端分层模型 - 图3

路由层有点像HTTP服务的网关层
路由层的主要职责功能

  1. 解析协议
  2. 记录用户在接入层的哪个节点上, 建立接入层服务器与客户端之间的一对一关系
  3. 保存用户状态
  4. 根据客户端发送的请求, 转发消息到对应的逻辑接口进行处理
  5. 服务端主动推送给客户端的时候, 找到接入层的哪一个节点与客户端建立的TCP连接

3. 逻辑层

逻辑层的主要

  1. 处理核心业务
  2. 对上层提供原子性逻辑接口

我们可以大致可以把 路由层转发过来的请求, 分为5类, 分别由对应的逻辑服务进行处理

  1. 登录业务接口
  2. 用户业务接口
  3. 好友业务接口
  4. 消息业务接口
  5. 群业务接口

4. 存储层

提供给路由层与逻辑层使用
有些信息必须要保证数据的一致性, 那么就需要存储在持久化存储介质上
例如MySQL, MongoDB, Cassandra …..
存储层如果可以的话, 应该屏蔽掉数据库的差别, 给逻辑层提供友好的数据访问接口,
并提供一些原子性的操作