引言
客服答疑、私信、群聊、直播等全部或者部分场景往往公司必须的。
本文主要走查下IM即时通信的逻辑架构以及常用的消息处理策略。
本文主要内容有:
- 逻辑架构分层
- 通信基本场景
- 消息处理策略
一、逻辑架构分层
1、逻辑架构图示
2、逻辑分层说明
- 负载均衡:提供四层/七层负载均衡
- 网关长连:提供长连接网关、该层也包含第三方厂商消息推送通道
- 路由分发:根据分发到不同的业务场景中的转发服务,避免和长连接耦合
- 业务逻辑:处理与即时通信相关的业务,单聊、群聊、打赏等
- 内网网关:负责各个域特殊场景对接和交互
3、消息推送通道
- 消息通过长连实现消息通信和推送
- 长连接的心跳维护和保活
- 当APP退出长连接关闭时可选择第三方辅助通道推送
- 第三方厂商通道有:苹果手机APNs(Apple Push Notification service)服务、安卓手机GCM(Google Cloud Messaging)服务、厂商公共推送服务。
4、消息发送流程
- userA发送一条消息到userB
- userA发送一条消息
- 消息通过IM系统存储
- IM系统推送该消息到userB
二、通信基本场景
通信基本场景有:消息内容、消息索引、最近联系人、未读消息等。
未读还可以分为:会话未读以及总未读,需要各自单独维护。
另外架构也与场景关联,如果一个群聊允许5000人和一个只有3个人的群聊会有极大差异。
1、消息内容
- 消息内容ID
- 消息内容
- 消息类型
- 生产时间
2、消息索引
- 用户ID
- 关联用户ID
- 收发消息类型
- 消息内容ID
3、最近联系人
- 用户ID
- 关联用户ID
- 消息内容ID
三、消息处理策略
1、发送重试策略
- 发送消息需要收到IM端回执
- 若未收到或超时需重试策略
2、幂等处理策略
- 发送侧针对重试消息生成唯一的messageId
- IM端根据messageId进行去重
3、消息推送确认
- IM将消息推送给终端用户侧
- 终端用户侧返回ack确认机制
- 未收到消息IM端将重新推送
- 终端用户侧会对消息幂等处理
4、消息的顺序性
- IM服务端提供序号生成器
- 保证群级别消息的顺序性
- 序号生成器分布式高可用
- 客户端对接收到的再整流
5、消息的安全性
- 私有二进制协议代替Json等
- 使用非对称加密传输协议
- DNS被劫持和篡改等
6、处理的原子性
- 使用分布式锁实现
- 使用分布式事务实现
- 原子操作的命令和脚本