https://mp.weixin.qq.com/s/KB1zdKcsh4PXXuJh4xb_Zw
用户uid-A登出时,会修改用户的服务端状态为离线。
经常的,服务端会将用户的服务端状态存储在高可用的缓存集群里。 什么是客户端状态?不同的产品,会有不同的客户端状态,例如隐身、离线、忙碌、勿扰等,这些状态大多是产品功能需求。画外音:微信,在设计之初,就摒弃了用户端状态这个概念。后文为了方便描述,不妨设待讨论的是QQ这种拥有客户端状态的产品,并假设客户端状态也只有在线和离线两种状态,后文统一称为“用户状态”。 如何获取好友的状态?uid-A登录时,先去数据库拉取自己的好友列表,再去缓存获取所有好友的状态。
用户uid-A的好友uid-B状态改变时(由登录、登出等动作触发),uid-A如何同步这一事件?这里就有推拉的设计折衷了。情况一:如果对于状态变更实时性要求不高,可以采用拉取。uid-A向服务器轮询拉取uid-B(其实是自己的全部好友)的状态,例如每1分钟一次,其缺点是:(1)如果uid-B的状态改变,uid-A获取不实时,可能有1分钟时延;(2)如果uid-B的状态不改变,uid-A会有大量无效的轮询请求,非常低效; 情况二:如果对于状态变更实时性要求较高,则必须推送。uid-B状态改变时(由登录、登出等动作触发),服务端不仅要在缓存中修改uid-B的状态,还要将这个状体改变的通知推送给uid-B的在线好友。
推送的优势是:实时。