zoukankan      html  css  js  c++  java
  • 关于维护用户状态的一致性

               IM的业界标杆肯定是QQ了。(貌似现在微信也算另一种标杆?)

               没有在腾讯工作过,也没有看过相关的源码,所以好奇它(们) 是怎样解决IM常见的一些技术难题的。

               今天我们来反思下如何维护状态的一致性比较妥。

                用户的状态粗略来看,只有在线和离线,以前的qq引入了离开与隐身的状态(现在也有,我说的“以前”的意思是qq有点老了。。)。

                无论怎么样,在各个客户端,必须实时性的保持状态的一致,不然用户肯定会吐槽,甚至想骂人(你有事要找A,看到了他离线的状态,实际上他在的。。)。

               

                那么最容易想到的方法登录时拉取全部,之后状态改变后,由服务器来推送。

               

              这里的难点在于过程3,中文表述的部分,难得无法用英语表达了。。。

              有些好友关系是双方的,还好一点,只要取用户A的好友列表就好了,再推送给在线的用户。

              否则,就要寻找所有包含A为好友的列表(QQ里面的陌生人,微信的假好友[你已经不在对方的好友列表了。。]),工作量加大很多。

              好,现在假设你已经找到了。假设好友200个,在线20%,那么推送系数为200*20%=40左右(也叫“消息风暴扩散系数”)。

              嗯,不错,任何一个人状态的一点改变,服务器就要*消息风暴扩散系数倍的推送。这里只是抛砖引玉,引起大家对状态推送扩散的思考。

              那除了推,还有别的办法吗?当然有了,任何的C/S架构的交互都有push/pull 方法。

              设计一个定时器去拉的话,缺点在于

              1)、实时性降低。

              2)、有可能是白拉,浪费带宽和服务器的运算(状态没变啊)

              

              哈哈,说了半天,啥也干不了。所以叫反思嘛,又没说解决。

             好的,接下来我们看看群聊的情况。

             假定A有20个群,每个群200人,在线率20%,那么消息风暴扩散系数=20*200*20%=800,这个意味着每次状态的变更导致800次

             的推送,不是1对1的两倍,是20倍,强烈不建议这样做。除非你的系统级别真的很小。

             定时拉,仍然有实时性和白拉的问题。

             可以延迟拉!用的时候拉。群和好友不同的地方在于,在不展开群的时候,用户是不关心群友的状态的。

             所以我们可以用户打开群聊的时候再刷新一遍状态,大大得降低了流量和资源。

              

              

            

  • 相关阅读:
    QTP的那些事右键点击对象的方法DeviceReplay
    QTP的那些事时间格式转换函数
    QTP的那些事DOM和childItem(row,column,micclass,index)
    QTP的那些事有关一个webtable数据的获取案例
    QTP的那些事webtable的一些重要使用集合精解
    QTP的那些事有关的一些重要可用的函数(发送邮件)
    ImportSheet in QTP Data Table from QC
    QTP的那些事执行用例后提交bug到QC中
    QTP的那些事一些需要记住的杂谈实践经验
    QTP的那些事报表自定义(excel,html,xml或者是其他格式的)
  • 原文地址:https://www.cnblogs.com/xuhuajie/p/11053894.html
Copyright © 2011-2022 走看看