1 用户视图的IM
IM系统组成
- 用户账号
聊天的参与需要用户,所以需要有一个用户账号,用来给用户提供唯一标识,以及头像、昵称等可供设置的选项 - 账号关系
账号之间通过某些方式(比如加好友、互关等)构成账号间关系网 - 联系人列表
你的好友列表或聊天对象的列表。其中你可选择一个联系人进行聊天互动等操作 - 消息
在聊天互动这个环节产生了消息 - 聊天会话
你和对方的聊天消息记录就组成了一个聊天会话,在会话里能看到你们之间所有的互动消息
2 研发视图的IM
2.1 组成
客户端
用户收发消息的终端,内置的客户端程序和服务端进行网络通信,用来承载用户的互动请求和消息接收功能。
接入服务
为客户端提供消息收发的出入口,即网关层服务。
接入层避免业务可使用统一协议的header,body部分直接透传二进制,或把body的编码分委托给其他的编解码api。另外对于protobuf还不够紧凑的问题可以再gzip一下后再下推客户端。
发送的消息先由客户端通过网络给到接入服务,然后再由接入服务递交到业务层进行处理。
接入服务的功能:
保持连接
消息推送
当服务端有消息需要推送给客户端时,也是将经过业务层处理的消息先递交给接入层,再由接入层通过网络发送到客户端。
协议的编解码
编解码实际主要是为了节省网络流量,系统会针对传输的内容进行紧凑的编码(比如Protobuf),为了让业务处理时不需要关心这些业务无关的编解码工作,一般由接入层来处理。
session维护
session的作用是标识“哪个用户在哪个TCP连接”,用于后续的消息推送能够知道,如何找到接收人对应的连接来发送。
接入服务还负责最终消息的推送执行,即通过网络连接把最终的消息从服务器传输送达到用户设备。
业务处理服务
消息业务逻辑处理,比如消息的存储、未读数变更、更新最近联系人等。
存储服务
账号信息、联系人关系链,以及消息本身,都需服务端存储持久化存储。还有一些用户消息相关的设置,比如:用户可以设置不接收某些人的消息,还有附件。
服务端可以只是维护一个用于暂存消息和信令的离线buffer,至于存多久和产品需求以及监管需求相关。
即时消息可以放到MQ中,或者缓存中,使用数据抽取工具周期性的将数据提交服务器,进行持久化。服务器存储历史数据和近实时的数据。其实就是通过 MQ来异步化解耦消息存储逻辑。
作用
- 会话一方用户不在线,上线时进行消息推送
- 内容审查,监管,电子证据,法律要求
- 数据分析,舆情分析