即时通讯方案

2021-07-08

im - 即时通讯,支持功能:文字 + 音视频 + 文件传输。分布式服务架构,支持海量用户。


1. 功能点

  • 用户关系(用户信息,添加好友等逻辑)。
  • 单聊。(支持在线聊天,离线推送。)
  • 群聊。(支持在线聊天,离线推送。)
  • 文件传输。(支持 p2p 在线传输,离线保存于文件服务器。)
  • 语音视频。(支持 p2p 在线传输和服务器转发。)

2. 通信协议

  • 网络层协议:tcp / udp。
  • 应用层协议:http / https。
  • 通信数据封包格式:protobuf / json。
协议 描述
tcp 长链接,用户保活,保证消息实时通信,使用谷歌的 protobuf 封装数据。
udp 无连接协议,保证音视频实时通信。
http/https 短链接,支持不同平台的业务逻辑,使用 json 封装数据。

3. 安全性

IM 为保证各个场景数据的安全,可以采用多种加密方法:https 协议,aes,rsa,ecdh(椭圆曲线迪菲-赫尔曼秘钥交换)算法。

  • 服务端落地数据,可以采用 rsa 等非对称加密算法,避免黑客拖库,或者内部人员泄漏敏感数据。
  • 实时通信数据。
    1. 短链接通信,采用 https 协议进行安全通信(例如文件的上传下载)。
    2. 文本消息 / 图片数据,可以通过 ecdh 协商加密(加密 aes 的对称密匙)。
    3. 音视频通信数据,为了安全也可以通过 ecdh 协商加密关键帧。

4. 服务架构

4.1. 服务功能

高性能高可用分布式服务集群。

服务 描述
中心服务 类似 zookeeper 管理服务节点。
接入服务 负责用户的登录认证,用户在线状态管理;或者业务协议请求转发到逻辑服务处理。
逻辑服务 负责用户关系,单聊,群聊等逻辑关系。
转发服务 负责在线文件,音视频,p2p 点对点打洞不通的情况下,数据转发。
文件服务 负责离线文件存储,短视频,短音频的存储,fastdfs 是分布式文件存储系统。
推送服务 负责离线消息,官方通知消息推送。
存储服务 redis 负责数据高速缓存,mysql 负责聊天等消息数据落地,kafka 负责日志消息和埋点等日志型数据存储消费。

4.2. 服务节点关系


4.3. 服务部署

  • 软件。
软件 版本
系统 CentOS Linux release 7.7.1908 (Core),
内核版本:3.10.0-1062.18.1.el7.x86_64
nginx nginx version: nginx/1.16.1
redis redis-6.2.4
mysql mysql Ver 14.14 Distrib 5.7.29, for Linux (x86_64)
kafka Apache Kafka 2.7.0
  • 硬件。

5. im 详细功能点

  • 用户注册登录。
    1. 注册
    2. 登录。
    3. 被强制下线。
  • 用户信息
    1. 查询用户信息。
    2. 修改用户信息。
  • 用户关系。
    1. 权限。
      1. 黑名单。
      2. 屏蔽消息。
      3. 取消/开启通知。
    2. 关系。
      1. 关注。
      2. 粉丝。
      3. 好友。
  • 聊天。
    1. 单聊。
      1. 发送单聊信息。
      2. 接收单聊信息。
      3. 发送单聊离线消息。
      4. 接收单聊离线消息推送。
    2. 群聊。
      1. 群组信息。
      2. 发送群组消息。
      3. 接收群组消息。
      4. 发送群组离线消息。
      5. 接收群组离线消息推送。
    3. 聊天记录。
  • 群组管理。
    1. 创建群组。
    2. 主动退出群组。
    3. 群组管理员踢人。
    4. 更新群组信息。
    5. 解散群组。
    6. 用户申请入群。
    7. 管理员审核入群申请。
    8. 邀请入群。
    9. 获取群组信息。
    10. 获取群组成员列表。
    11. 申请入群管理员审核通知。
    12. 群成员变更通知。
    13. 群通知。
    14. 入群审核结果通知。
    15. 群信息更改通知。
    16. 用户被踢出群组通知。
  • 搜索。
    1. 搜索用户。
    2. 搜索群组。
  • 消息推送。
    1. 官方消息推送。
    2. 离线消息推送。
  • 音视频。
    1. 单聊群聊。
  • 文件。
    1. 单聊发送文件。(在线文件或离线文件。)
    2. 群组发送文件。(在线文件或离线文件。)