您现在的位置是:亿华云 > 人工智能
QQ好友状态,QQ群友状态,究竟是推还是拉?
亿华云2025-10-09 01:26:26【人工智能】7人已围观
简介状态同步,有好友状态的同步,有群友状态的同步,有的需要实时同步,有的能够容忍延时。任何脱离业务的架构设计都是耍流氓,不同场景下,状态同步,究竟是推送还是拉取呢?用户的在线状态,分为客户端状态(端),服
状态同步,好友有好友状态的状态状态同步,有群友状态的群友同步,有的究竟需要实时同步,有的推还能够容忍延时。任何脱离业务的好友架构设计都是耍流氓,不同场景下,状态状态状态同步,群友究竟是究竟推送还是拉取呢?
用户的在线状态,分为客户端状态(端),推还服务端状态(云)两种形态。好友
什么是状态状态服务端状态?
服务端状态,主要分为在线online和离线offline,群友不同的究竟状态,对于不同的推还业务处理流程可能不同。例如对于消息的处理:
服务端状态在线,直接投递给用户; 服务端状态离线,直接存储离线消息,等用户下一次登录拉取;如何实时更新服务端状态?
用户uid-A登录时,会修改用户的服务端状态为在线。b2b信息网
用户uid-A登出时,会修改用户的服务端状态为离线。
经常的,服务端会将用户的服务端状态存储在高可用的缓存集群里。
什么是客户端状态?
不同的产品,会有不同的客户端状态,例如隐身、离线、忙碌、勿扰等,这些状态大多是产品功能需求。
画外音:微信,在设计之初,就摒弃了用户端状态这个概念。
后文为了方便描述,不妨设待讨论的是QQ这种拥有客户端状态的产品,并假设客户端状态也只有在线和离线两种状态,后文统一称为“用户状态”。
如何获取好友的状态?
uid-A登录时,先去数据库拉取自己的好友列表,高防服务器再去缓存获取所有好友的状态。
用户uid-A的好友uid-B状态改变时(由登录、登出等动作触发),uid-A如何同步这一事件?
这里就有推拉的设计折衷了。
情况一:如果对于状态变更实时性要求不高,可以采用拉取。
uid-A向服务器轮询拉取uid-B(其实是自己的全部好友)的状态,例如每1分钟一次,其缺点是:
如果uid-B的状态改变,uid-A获取不实时,可能有1分钟时延; 如果uid-B的状态不改变,uid-A会有大量无效的轮询请求,非常低效;情况二:如果对于状态变更实时性要求较高,则必须推送。
uid-B状态改变时(由登录、登出等动作触发),服务端不仅要在缓存中修改uid-B的状态,还要将这个状体改变的通知推送给uid-B的在线好友。
推送的优势是网站模板:实时。
缺点是:当在线好友量很大时,任何一个用户状态的改变,会扩散成N个实时通知,这个N叫做“消息风暴扩散系数”。假设一个IM系统平均每个用户有200个好友,平均有20%的好友在线,那么消息风暴扩散系数N=40,这意味着,任何一个状态的变化会变成40个推送请求。
群友状态的一致性,和好友状态的一致性相比,复杂在哪里?可不可以采用实时推送?
群这个业务场景大伙也非常之熟悉,你能够加入若干群(例如20个),假设平均每个群有200人,即你会有4000个群友。
理论上群友状态也可以通过实时推送的方式实现,以保证实时性。进一步讨论之前,先一起估算下这个业务场景下的“消息风暴扩散系数”。
假设平均每个用户加了20个群,平均每个群有200个用户,依然假设20%的用户在线,那么为了保证群友状态的实时性,每个用户登录,就要将自己的状态改变通知发送给20*200*20%=800个群友,N=800,意味着,任何一个状态的变化会变成800个推送请求。如果说好友状态实时推送,消息风暴扩散系数N=40尚可以接受,那么群友状态实时推送,N=800则是灾难性的。此类业务往往采用轮询拉取的方式,获得群友的状态。
轮询拉取群友状态也会给服务器带来过大的压力,还有什么优化方式?
群友的数据量太大,虽然每个用户平均加入了20个群,但实际上并不会每次登录都进入每一个群。不采用轮询拉取,而采用按需拉取,延时拉取的方式,在真正进入一个群时才实时拉取群友的在线状态,是既能满足用户需求(用户感觉是状态是实时、一致的,但其实是进入群才拉取的),又能降低服务器压力。这是一种常见方法。
总结
状态的实时性与一致性是一个较难解决的技术问题,不同的业务实现方式不同,一般来说:
好友状态同步,是采用推送的方式同步; 群友状态同步,由于消息风暴扩散系数过大,一般采用拉取的方式同步; 群友状态同步,还能采用按需拉取的优化方式,进一步降低服务端压力; “消息风暴扩散系数”是指一个消息发出时,变成N个消息的扩散系数,这个系数一定程度上决定了技术采用推送还是拉取;画外音:群消息的推送,也存在“消息风暴扩散系数”的问题。
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】
戳这里,看该作者更多好文
很赞哦!(4677)
相关文章
- 4、选择一个安全的域名注册商进行域名注册
- 天天说要做性能优化,到底在优化什么?
- 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!
- 我不能没有的5个Vue.js库
- 3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
- 程序员生存观察:为什么非要谈理想?我就想挣点钱
- 干货|SpringBoot JMS(ActiveMQ)API实践应用详解
- 用Python 通过动态规划完成公务员考试题
- 域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
- 如果不能用Python执行机器学习,那该用什么呢?
站长推荐
比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
Python列表的11个方法全解
使用WebAssembly提高模型部署的速度和可移植性
这些高阶的函数技术,你掌握了么
其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
解放开发者!3款工具实现快速K8S开发
设计模式系列—中介者模式
Github上12个Star过万的Vue.js项目