聊天室和其他模块最大的区别在于聊天室类人数多,单位时间消息量巨大,在这种场景下如果开发者还是按照处理群的逻辑来处理聊天室就会引起很多的问题,下面主要列举一下常见的问题。

Q:登录云信聊天室是否要求先登录 IM?

云信的聊天室服务和云信账号绑定,所以必须要求先进行 IM 鉴权后才能够使用聊天室接口。

Q:云信是否支持匿名登录?

目前云信并没有在服务层直接支持匿名登录,但是业务层可以模拟匿名登录的状态。从原理上来说,所有的匿名登录只是一种比较便捷且不需要用户进行输入用户名密码的有名登录,换言之,所有的匿名登录在实现上仍旧需要向服务器提交一定的用户信息以做鉴权。所以业务方可以事先分配云信账号的方式进行匿名登录。

Q:进入聊天室后断线怎么办?

进入聊天室后因为网络状况引起的掉线,云信 SDK 会自动进行重连,直到重新进入聊天室为止,不需要上层开发做任何干预。

Q:如何获取聊天室内用户信息?

聊天室内获取用户信息的场景大致有两种:

  • 聊天室内有用户发消息,接受者需要显示发送方的名字;

  • 用户在浏览聊天室内用户信息。

第一种情况:上层开发无需主动调用获取用户信息的接口,因为我们已经在每条消息填充了消息发送者的基本消息(目前主要是用户 Id, 昵称和头像),如果需要更详细的数据,推荐在调用进入聊天室接口时填充到拓展信息中,拓展信息同样会出现在后续该用户发出的所有消息中,包括通知消息,如进入聊天室和离开聊天室的通知。

第二种情况:调用聊天室获取用户接口返回的用户对象中同样已经包括用户 Id,昵称,头像信息和拓展信息,无需再次请求用户信息。

错误姿势:在聊天室中每收到一条消息就去获取当前消息发送者的详细用户信息。

原因在于:聊天室内的人数众多,消息量巨大,以一个聊天室内有 1W 人为例,假设平均一秒钟有 100 条消息,如果按照上面的逻辑操作,每一秒就会有 100 W 次用户信息的请求发送给服务器,明显是不可取的,同时客户端也会因为在 1 分钟内发送了过多的用户信息请求(每分钟 6000 条)而触发服务器频控。

Q:如何优雅地发送聊天室消息?

聊天室内调用消息发送接口和调用群/个人的消息一样,并没有什么特殊的要求。但是由于特殊的业务需求,往往会遇到和群里或者个人消息完全不同的问题。

举例说明:
直播间的点赞消息,经常需要发送各种连击点赞,几秒内刷出几十条消息,甚至上百条消息。而这样很容易触发服务器频控,同时也导致接收端处理不过来(下个问题会具体分析这种情况)。

解决方案:
合并消息。将多个点赞消息合并为一个点赞消息,同时这个点赞消息包含当前消息内有多少个赞的信息。处理流程:当用户点赞时,缓存当前的赞信息,并进行计时(如 0.3s),那么当计时时间触发时或者赞数积累到阈值时,将当前的赞打包成一个点赞消息并发送。

Q:如何优雅地接收聊天室消息?

和发送消息不同,聊天室内接受消息会有各种极限问题出现,主要诱因在于聊天室内的单位时间内消息量非常大,需要对这种极限情况进行合理处理。一个合理地假设是聊天室内每秒收到 100 条以上的消息很常见,那么我们就来看下每秒收到 100 条消息对 App 来说是个什么样的情况。

一般而言,一个 App 要达到流畅的水准,需要界面保持每秒 60 帧,那么意味着每一帧需要处理大约两条消息,而 App 在收到这些消息后往往需要做动画,文字高度计算,界面重排版等工作,再算上界面本身的一些工作,很容易堵塞主线程,使得主线程卡顿甚至卡死。

那么怎么办呢?

  • 合并消息通知

服务器在 1 秒内下发 100 条并不意味着客户端一定需要有 100 条消息通知,客户端可以选择性将这些消息合并,将 100 次每次一条消息的通知合并成几次每次几十条消息的通知,这使得上层需要处理的事件数大幅度减少(虽然消息量并没有变化)。而在云信这里,这一部分会由 SDK 自动完成。 1 秒内 100 条消息往往会被归并成大约 3-4 次通知,每次通知内附带 30 多条消息。

  • 后台计算

上一步我们将消息通知进行归并,减少了消息的通知次数,这样变相减少了 App 被触发刷新界面的次数,但是消息总数并没有减少,仍旧有这么多消息需要放到界面上进行显示。而显示的第一步往往是需要计算对应的文本消息的尺寸以进行最终的排版,而这一部分如果放到 UI 线程中处理,仍会占用大量主线程时间,所以可以将这部分的计算放到后台线程中进行,等计算出最终的结果后再 dispatch 到主线程进行最终的控件添加和显示即可。 (虽然一般情况下 UI 相关的操作是需要在主线程中进行的,但是某些 UI 操作仍是可以在后台进行的)

  • 估算

即便使用后台计算,某些计算仍旧会占用大量 CPU ,如计算文字高度,当我们调用系统方法,设置文字字体,获取文字所占大小时,系统一般需要遍历每一个文字(在 iOS 里面一般会使用是 CTRun 的概念,CTRun 表示的是排版最小单元,并不特指是一个字),根据文字的属性进行预排版并追踪计算出大小。但实际上对于一些特殊的文本,我们完全可以根据其文本长度直接估算出对应的大小,而省去调用系统 API 进行计算的麻烦。(举例来说,少于10个字的文字,肯定是无法占满一行,那么他的高度一般就是个固定值)

  • 消息选择性显示

由于聊天室是个流动性非常大,消息量非常大的场景,虽然 App 也的确收到了这么多消息,但实际上并不需要将消息一一显示到界面上,部分超过范围的消息可以进行选择性丢弃。举个例子,当前界面实际上只能显示约 20 行聊天记录,而我们一下子收到将近 100 条消息,那么实际上我们只需要将最后 20 条消息放到界面中显示,而其余的消息只加入到内存 model 中,只有当用户真正上拉到对应位置时才进行真正的消息内容显示。

网易云信∣真正稳定的IM云服务

http://netease.im  长按识别,更多精彩

关于网易云信聊天室 FAQ相关推荐

  1. Android项目中接入网易云信聊天

    首先上图 由于项目中原有的聊天出现收发消息不及时以及其他的问题,导致客服那边损失了不少的订单,遂接入新的第三方即时聊天sdk.有人可能会说,为什么不自己写呢?技术人员不够,时间长,开发成本高,最主要的 ...

  2. 网易im聊天室的集成

    主要的 : 上线是enterRoom(); 进入聊天室我们得携带一些参数,这样以后每发一条消息都会将这些参数携带: Map<String, Object> ext = new HashMa ...

  3. 网易云信直播聊天室:无上限人数系统不卡顿,是不是鱼与熊掌不能兼得?

    1.直播聊天室的形式和应用场景 在一般人的理解中,直播聊天室应该就是直播画面旁边配一个聊天窗口,众多观看者在 里面发表自己的评论(如图1).Oh, NO!这样的场景是不是太Low啦!随着互联网技术和消 ...

  4. 技术干货 | 网易云信大规模聊天室系统架构解析

    导读:聊天室是一类非常重要的 IM 系统,不同于单聊和群聊,聊天室是一种大规模的实时消息分发系统.本文我们来详细介绍一下网易云信大规模聊天室系统的具体架构以及实践应用案例. 文|曹佳俊 网易云信资深服 ...

  5. 云信小课堂|搭建应用级别在线聊天室,7步就够了!

    Vol. 6 从2000年至今,聊天室一直活跃在人们的各种生活场景中,目前广泛运用于超级小班课.互动大班课.连麦开黑.主播 PK 等场景,还具备文本.表情.点赞.撒花等互动方式,架起沟通桥梁的同时,玩 ...

  6. 从0搭建在线聊天室,只需4步!

    Vol. 5 聊天室不同于单聊和群聊,是一类集成了多种 IM 功能一体的大规模实时消息分发系统.在跨入新世纪的2000年,聊天室作为新型的即时通讯场景迅速在年轻人群体中火热起来,"网易聊天室 ...

  7. IM即时通讯:如何跳出传统思维来设计聊天室架构?

    因为视频直播业务的大规模扩张,聊天室这种功能在最近几年又火了起来.本篇文章将会重点挑选聊天室这个典型场景,和大家分享一下网易云信在实现这个功能时是如何做架构设计的. 相关推荐阅读 几十万人同时在线的直 ...

  8. 抓住语音社交风口,1天快速搭建语音聊天室

    语音聊天室孵化 一起KTV.众人大合唱.语音开黑.狼人杀.剧本杀.多人配音.观影.语音电台.相亲联谊社交等,一般都是在语音聊天室中进行,那么语音聊天室产品如此火热的原因有哪些呢? 一对一社交适用于朋友 ...

  9. 周梁伟:聊天室架构 如何跳出传统思维来设计?

    周梁伟 现任网易云信 IM云服务器端开发负责人,浙江大学计算机学院硕士.2011年加入网易,先后担任网易后台技术中心与网易大数据平台资深开发工程师,负责即时通讯领域的产品开发与应用服务器与大数据领域战 ...

最新文章

  1. Unity -- 材质-Material和预设体-Prefabs
  2. js vm报错_uni-app v3版本更新常见问题排查
  3. mysql 按条件更新
  4. php获取当前月月初至月末的时间戳,上个月月初至月末的时间戳
  5. webrtc agc matlab,c++ WebRTC AGC(自动增益控制)
  6. php -l 检查文件是否语法错误
  7. 传智播客Java常量进制转换数据类型
  8. java开发业务流程图,什么是业务流程图?业务流程图如何绘制?
  9. Mac无法打开“XX”,因为Apple无法检查其是否包含恶意软件。”的解决办法
  10. 视频解析接口公众号对接教程
  11. 服务器磁盘阵列数据恢复方法和数据恢复过程详解
  12. 解决:元素内容必须由格式正确的字符数据或标记组成。
  13. 怎样让计算机快速开机,怎样快速设置电脑定时自动开机
  14. 2020年裸辞的人,真的待业了一整年吗?
  15. WFP(三)——编译、部署驱动文件*.sys——微软msnmntr项目
  16. html5 微网页 点餐_使用HTML5和微数据向网页添加电话号码
  17. Bean对象的拷贝方法BeanCopier和BeanUtils
  18. 全球及中国生物敷料市场竞争态势与投资风险分析报告2022年
  19. javascript实现鼠标移动两个小人的动画效果
  20. Iconfont 开源库 Iconic 使用 方便你使用svg图片。随意更改你的色调。

热门文章

  1. Cheat Engine 小白教程(大白话教学 下篇
  2. 男导师的妻子叫“师母”,那么女导师的丈夫怎么称呼?
  3. 罗马字母和希腊字母读法(in math)
  4. 单目标跟踪通过CAM绘制heatmap图像(以SiamCAR为例)
  5. 黄老板巡演票房连续走高 门票总收入接近三亿美元
  6. Discuz!应用中心开发者后台在移动线路下无法打开的解决办法
  7. 程序员必备:拯救颈椎,只需三个步骤
  8. 计算正方体、圆柱体的表面积、体积
  9. 解决方案:Zotero实现参考文献中英文混排,将英文文献中的“等”转成“et al.”
  10. 计算机专业读书推荐卡图片大全,如何完成实践作业《好书推荐卡》,大家谈