服务器端
- 启动将自己的节点注册到zookeeper上
- 开启心跳
- 用户登录将用户ID和channel,用户ID和msg存入redis中
客户端
登录login,根据用户名和ID获取路由服务中的IMserver,并且将IMserver保存内存中
将发送的消息分批保存到文件中
网关设计
- netty实现的一个网关,netty非常适合做大量长连接网关。
漫游消息
“消息漫游”是指一个用户在任何端,都可以拉取到历史消息,关键点是:
(1) 所有消息存储在云端;
(2) 每个端本地存储last_msg_id,在登录时可以到云端同步历史消息;
(3) 云端存储所有消息成本较高,一般会对历史消息时间(或者条数)进行限制;
多点登录
“多点登录”是指多个端同时登录一个帐号,同时收发消息,关键点是:
(1) 需要在服务端存储同一个用户多个端的状态与登陆点;
(2) 发出消息时,要对发送方的多端与接收端的多端,都进行消息投递;
离线消息
可参考https://mp.weixin.qq.com/s/iKRTqY46CD0RGoSkrrYefg
(1) 对于同一个用户B,一次性拉取所有用户发给ta的离线消息,再在客户端本地进行发送方分析,相比按照发送方一个个进行消息拉取,能大大减少服务器交互次数;
(2) 按需拉取,是无线端的常见优化;
(3) 分页拉取,是一个请求次数与包大小的折衷;
(4) 应用层的ACK,应用层的去重,才能保证离线消息的不丢不重;
(5) 下一页的拉取,同时作为上一页的ACK,能够极大减少与服务器的交互次数;
群消息
(1)不管是群在线消息,还是群离线消息,应用层的ACK是可达性的保障;
(2)群消息只存一份,不用为每个用户存储离线群msg_id,只需存储一个最近ack的群消息id/time;
(3)为了减少消息风暴,可以批量ACK;
(4)如果收到重复消息,需要msg_id去重,让用户无感知;
(5)离线消息过多,可以分页拉取(按需拉取)优化;