用户状态
最基本的:在线、离线等,更详细的:隐身、忙碌、勿扰等。
客户端如何与服务端同步用户状态?
好友状态同步
客户端定时轮询拉取
优点:实现简单,适用实时性要求不那么高的场景;
缺点:
- 定时轮询,非实时;
- 一次性拉取用户所有好友的状态,但是可能很多好友的状态没发生变化,因此拉取较多的无用数据,甚至多次无效轮询,低效;
服务端推送
优点:
- 实时性较高;
- 消息针对性较高,只推送客户端关心的数据;
缺点:当用户有较多好友时,这个用户的状态变化想消息就需要推送给他的所有好友,即 任何一个用户状态的改变,会扩散成N个实时通知,这个N叫做“消息风暴扩散系数”。
群友状态同步
每个用户都会有好几个群,每个群都可能有上百人,在这种场景下,服务端推送显然不合适,因为,这时下搜西风暴扩散系数太大了,对服务器压力造成的压力很大;
因此可以客户端定时查询群友状态;
缺点:由于群、群友比较多,因此,一次性拉取群友状态数据量会比较大;
按需拉取
当用户真正使用到群时,比如进入群 or 查看群友列表等时,客户端再拉取这个群的群友状态,既能满足用户需求(用户感觉是状态是实时、一致的,但其实是进入群才拉取的),又能降低服务器压力;
参考: