

IM单聊和群聊中的在线状态同步应该用“推”还是“拉”?
source link: http://yunxin.163.com/blog/zhuan-im4-4/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

“用户在线状态的一致性”(单聊好友在线状态、群聊用户在线状态)是IM应用领域比较难解决的一个技术问题,如何精准实时的获得好友、群友的在线状态,是今天将要探讨的话题。
2、IM开发干货系列文章,欢迎关注网易云信博客
3、保持单聊好友状态的一致性
1场景一:用户uid-A登录时,如何获取自己全部好友的在线状态?
一个典型的IM大致的处理逻辑是这样的:
1)服务器要存储所有用户的在线状态(往往存储在保证高可用的缓存集群里) -> 保证状态可查,流程见下图:
2)用户状态实时变更,任何用户登录时,需要将服务端自己的在线状态置为online;任何用户登出时,需要将服务端自己的状态置为offline -> 保证服务端状态存储的一致性与实时性,流程见下图:
3)uid-A登录时,先去数据库拉取自己的好友列表,再去缓存获取所有好友的在线状态 -> 保证登录时好友状态获取的一致性与实时性,流程见下图:
2场景二:用户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的在线反向好友(反向好友是指:加了uid-B为好友的人,而不是uid-B的好友,这个细节要注意)。
方案二的优点:实时。
方案二的缺点:当在线好友量很大时,任何一个用户状态的改变,会扩散成N个实时通知,这个N叫做“消息风暴扩散系数”。
设一个im系统平均每个用户有200个反向好友,平均有20%的反向好友在线,那么消息风暴扩散系数N=40,这意味着,任何一个状态的变化会变成40个推送请求。
4、保持群聊友状态的一致性
1场景一:群友状态一致性有什么不同,和好友状态一致性相比复杂在哪里?为什么不能采用实时推送?
理论上群友状态也可以通过实时推送的方式实现,以保证实时性。但实际上,群友状态一般都是采用拉取的方式获得,因为群友状态“消息风暴扩散系数”N实在太大,全部实时获取系统往往承受不了。
假设平均每个用户加了20个群,平均每个群有200个用户,依然假设20%的用户在线,那么为了保证群友状态的实时性,每个用户登录,就要将自己的状态改变通知发送给20*200*20%=800个群友,N=800,意味着,任何一个状态的变化会变成800个推送请求。
XXX系统使用的是群友状态推送,不存在的这样的问题?那很可能是,XXX系统的用户量和活跃度还不够高吧。
2场景二:轮询拉取群友状态也会给服务器带来过大的压力,还有什么优化方式?
群友的数据量太大,虽然每个用户平均加入了20个群,但实际上并不会每次登录都进入每一个群。不采用轮询拉取,而采用按需拉取,延时拉取的方式,在真正进入一个群时才实时拉取群友的在线状态,是既能满足用户需求(用户感觉是状态是实时、一致的,但其实是进入群才拉取的),又能降低服务器压力。这是一种常见方法。
总结与建议
IM应用中在线状态的实时性与一致性是一个较难解决的技术问题,不同的业务接受度,不同的数据量并发量在线量,实现方式不同。
个人建议的方式是:
- 好友状态,如果对实时性要求较高,可以采用推送的方式同步;如果实时性要求不高,可以采用轮询拉取的方式同步;
- 群友的状态,由于消息风暴扩散系数过大,可以采用按需拉取,延时拉取的方式同步;
- 系统消息/开屏广告等对实时性要求不高的业务,可以采用拉取的方式获取消息;
- “消息风暴扩散系数”是指一个消息发出时,变成N个消息的扩散系数,这个系数与业务及数据相关,一定程度上它的大小决定了技术采用推送还是拉取。
(原文链接:有删节,http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959618&idx=1&sn=912a9af6d000c6681dc645e53590729b&chksm=bd2d049e8a5a8d884f6acb35bc5b40edf88127219542c9e3033bb4c2e33854657c315c8a93b7&scene=21#wechat_redirect)
来源:即时通讯网 – 即时通讯开发者社区!了解网易云信,来自网易核心架构的通信与视频云服务。
网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通信与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者通过集成客户端SDK和云端OPEN API,即可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能
Recommend
-
38
状态同步,究竟是推还是拉?
-
51
5月16日,河南济源网友“逆流而上”为了向朋友证明,微信群里一次能发一万元的红包,于是在一个500人的微信群里,在红包里输入了一万元的金额。本想截屏,没想到手指没及时拿开,触发指纹支付,一万元红包发出去了……
-
23
本实验用到的原始数据和脚本: https://github.com/mandrigin/ethereum-mainnet-resolver-witness-stats 引言 有一种...
-
24
哈喽!大家好!我是木瓜太香,一位老牌儿前端工程师,平时我们在使用 vue 开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面也要用,今天我们就来看看怎...
-
6
以太坊开发者计划于Q3进行Eth1和Eth2合并的状态同步 - 律动BlockBeats 律动 BlockBeats 消息,7 月 6 日,以太坊开发者 7 月 1 日进行 Eth1 和 Eth2 合并电话会议,计划于第三季进行合并的状态同步 共识 API(执行/共识团队都在这方面工作) 本季度晚些时候...
-
8
除非业务逻辑非常简单单一,典型的以太坊应用一般都绕不开状态同步的问题。这里所说的状态指的是“交易状态”,所谓状态同步即指:将链上交易状态同步到业务数据库中。 为什么要做状态同步? 这个问题的答案很直接,无外乎两点...
-
9
本文由作者“大白菜”分享,个人博客 cmsblogs.cn,有较多修订和改动。注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷!接上篇《IM系统设计篇》,本篇主要讲解的...
-
4
基于Netty,从零开发IM(二):编码实践篇(单聊功能)
-
5
在 WWDC 2019 上,苹果推出了 Core Data with CloudKit API ,极大地降低了 Core Data 数据的云同步门槛。由于该服务对于开发者来说几乎是免费的,因此在之后的几年中,越来越多的开发者在应用中集成了该服务,并为用户带来了良好的跨设备、跨平台的使用体验。本文将...
-
6
V2EX › 微信 微信的聊天状态同步问题? shuxhan
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK