You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
11 KiB
Markdown

2 years ago
# 开篇词 | 搞懂“实时交互”的IM技术将会有什么新机遇
你好,我是袁武林。我来自新浪微博,目前在微博主要负责消息箱和直播互动相关的业务。接下来的一段时间,我会给你带来一个即时消息技术方面的专栏课程。
你可能会很好奇为什么是来自微博的技术人来讲这个课程微博会用到IM的技术吗
在我回答之前,先请你思考一个问题:
> 除了QQ和微信你知道还有什么App会用到即时实时消息技术吗
其实除了QQ和微信外陌陌、抖音等直播业务为主的App也都深度用到了IM相关的技术。
比如在线学习软件中的“实时在线白板”导航打车软件中的“实时位置共享”以及和我们生活密切相关的智能家居的“远程控制”也都会通过IM技术来提升人和人、人和物的实时互动性。
**我觉得可以这么理解包括聊天、直播、在线客服、物联网等这些业务领域在内所有需要“实时互动”“高实时性”的场景都需要、也应该用到IM技术。**
微博因为其多重的业务需求在许多业务中都应用到了IM技术目前除了我负责的消息箱和直播互动业务外还有其他业务也逐渐来通过我们的IM通用服务提升各自业务的用户体验。
![](https://static001.geekbang.org/resource/image/a3/b4/a398742dac1db7c8931a1e20c2dee5b4.jpg)
为什么这么多场景都用到了IM技术呢IM的技术究竟是什么呢
所以在正式开始讲解技术之前我想先从应用场景的角度带你了解一下IM技术是什么它为互联网带来了哪些巨大变革以及自身蕴含着怎样的价值。
## 什么是IM系统
我们不妨先看一段旧闻:
> 2014年Facebook以190亿美元的价格收购了当时火爆的即时通信工具WhatsApp而此时WhatsApp仅有50名员工。
是的也就是说这50名员工人均创造了3.8亿美元的价值。这里我们不去讨论当时谷歌和Facebook为争抢WhatsApp发起的价格战从而推动这笔交易水涨船高的合理性**从另一个侧面我们看到的是依托于IM技术的社交软件在完成了“连接人与人”的使命后体现出的巨大价值。**
同样的价值体现也发生在国内。1996年几名以色列大学生发明的即时聊天软件ICQ一时间风靡全球3年后的深圳它的效仿者在中国悄然出现通过熟人关系的快速构建在一票基于陌生人关系的网络聊天室中脱颖而出逐渐成为国内社交网络的巨头。
那时候这个聊天工具还叫OICQ后来更名为QQ说到这大家应该知道我说的是哪家公司了没错这家公司叫腾讯。在之后的数年里腾讯正是通过不断优化升级IM相关的功能和架构凭借QQ和微信这两大IM工具牢牢控制了强关系领域的社交圈。
**由此可见IM技术作为互联网实时互动场景的底层架构在整个互动生态圈的价值所在。**
随着互联网的发展人们对于实时互动的要求越来越高。于是IM技术不止应用于QQ、微信这样的面向聊天的软件它其实有着宽广的应用场景和足够有想象力的前景。甚至在不知不觉之间IM系统已经根植于我们的互联网生活中成为各大App必不可少的模块。
除了我在前面图中列出的业务之外如果你希望在自己的App里加上实时聊天或者弹幕的功能通过IM云服务商提供的SDK就能快速实现当然如果需求比较简单你也可以自己动手来实现
比如在极客时间App中我们可以加上一个支持大家点对点聊天的功能或者增加针对某一门课程的独立聊天室。
例子太多,我就不一一列举了。其实我想说的是:**IM并不是一门仅限于聊天、社交的技术实际上它已经广泛运用于我们身边形形色色的软件中。**
随着5G等高速移动网络技术的快速推进网络速度和稳定性大幅提升、网络流量费用降低势必今后还会有越来越多的软件依托即时消息的优势理念加入到IM的大家庭中来毕竟谁不希望所有互动都能“实时触达”而且“安全可靠”呢
## 应用场景不同,适用的解决方案也不同
另外从技术的角度来看IM技术在后端的实现上并不是孤立存在的实际上我们可以认为IM技术是众多前后端技术的一个综合体只不过和其它业务相比由于自身使用场景在某些技术点上有更多侧重。
![](https://static001.geekbang.org/resource/image/00/fc/004bd32b14df6fd8bd4569e2844428fc.png)
在整个IM系统的实现上深度用到了**网络、数据库、缓存、加密、消息队列**等后端必备知识。架构设计中也在**大规模分布式、高并发、一致性架构设计**等方面有众多成熟的解决方案。
**所以我们可以认为在学习和实践IM技术的过程中也可以系统化提升你在这些方面的整体能力。**
我第一次接触IM系统并不是和“人”相关的场景当时就职的公司做的是一个类似“物联网”的油罐车实时追踪控制系统一是通过GPS实时跟踪油罐车的位置判断是否按常规路线行进一是在油罐车到达目的地之后通过系统远程控制开锁。
所以这里的交互实际是“车”和“系统”的互动当然这个系统实现上并没有多大的技术挑战除了GPS的漂移纠偏带来了一些小小的困扰最大的挑战莫过于调试的时候需要现场跟车调试多地奔波。
再后来由于工作的变动我逐渐接触到IM系统中一些**高并发的业务场景****千万级实时在线用户,百亿级消息下推量,突发热点的直线峰值等**。一步一步地踩坑和重构除了感受到压力之外对IM系统也有了更深层次的理解。
记得几年前,由于消息图片服务稳定性不好,图片消息的渲染比较慢,用户体验不好。
而且由于图片流和文本流在同一个TCP通道TCP的阻塞有时还会影响文本消息的收发。
所以后来我们对通道进行了一次拆分,把图片、文件等二进制流拆到一个独立通道,核心通道只推缩略图流,大幅减轻了通道压力,提升了核心链路的稳定性。
同时,独立的通道也缩短了客户端到文件流的链路,这样也提升了图片的访问性能。
但后来视频功能上线后我们发现视频的PSR11秒内播放成功率比较低原因是视频文件一般比较大为避免通道阻塞不会通过消息收发的核心通道来推送。
所以之前的策略是通过消息通道只下推视频的ID用户真正点击播放时才从服务端下载这种模式虽然解决了通道阻塞的问题但“播放时再下载”容易出现卡顿的情况。
因此针对视频类消息我们增加了一个notify-pull模式当客户端收到一条视频类消息的通知时会再向服务器发起一个短连接的拉取请求缓冲前N秒的数据。
这样等用户点击播放时基本就能秒播了较大地提升了视频消息播放的PSR11秒内播放成功率
**因此我们要打造一套“实时、安全、稳定”的IM系统我们需要深入思考很多个地方尤其是作为整个实时互动业务的基础设施扩展性、可用性、安全性等方面都需要有较高的保障。**
比如下面几种情况。
* 某个明星忽然开直播了,在线用户数和消息数瞬间暴涨,该如何应对?
* 弱网情况下,怎么解决消息收发失败的问题,提升消息到达率?
* 如何避免敏感聊天内容由于网络劫持而泄露?
诸如此类的问题可能有很多种解决方案,但是对于不同的场景适用的方案可能也不一样。
因此在随后的内容里我希望能够先系统化地带着你了解一下一套基础的IM系统的整体构成以及不同业务场景下可能存在的问题点和瓶颈点。
然后我会从经验角度出发来和你一起深入探讨这些问题并在这一过程中尽量遵循解决问题的3W原则What、Why、How。从问题现象出发结构化分析问题的本质原因并讨论多种解决问题的优劣和选择。
我希望能通过这样的方式不仅让你对IM的核心组成有一个整体的认识而且能够在各个瓶颈点的分析和后续的实践中形成较为深刻的思考和实践能力逐渐完善自身关于IM系统架构的知识网络。
## 课程设置
我们的课程分成三个模块,基本思路是:先从整体了解、再细化到每个垂直领域去了解它们有什么不同,进而关注到一些实现上的关键技术点、然后再回归到整体层面。
### 基础篇
本模块我们会开始学习**一个即时消息系统的基础结构以及如何为你的App加入即时消息的模块。**并且我们会从即时消息系统所适用的业务场景需求出发学习IM有别于其他业务系统的特性功能比如实时性、安全性以及这些功能的具体实现。
### 场景篇
在场景篇里,我会挑选即时消息技术的几个具体应用场景,**这些场景相对个性化,而且在某些特性的技术实现上有一定挑战**,我会针对这些场景比较核心的重点和难点来进行拆分讲解。比如,消息的多终端漫游功能的实现重点,以及直播互动场景中峰值流量的应对等等。
### 进阶篇
进阶篇在基础篇的即时消息的基础能力之上,介绍了相对更高级一些的功能,比如和苹果的推送服务对接。另外也更多关注于即时消息场景里在**海量消息、高并发、服务高可用、服务保障**等方面的优化实践,这部分内容具备较强的通用性,适用于大部分后端服务架构,从事后端服务开发设计的同学应该都会有所收获。
我希望能通过这个专栏,把这些年积累到的一些一线的实战经验进行梳理和沉淀,让感兴趣的小伙伴从中真正了解到,在超大用户规模的场景下,我们的即时消息系统经常会碰到的一些问题和容易出现瓶颈的环节,以及最终如何通过技术的升级和架构上的优化,来一一化解。
另外我希望你在掌握即时消息技术的同时,还能从**这些实际上适用于大部分互联网后端业务的技术点和架构思想中,能体会到技术的互通性,通过思考和沉淀,形成自己的一套后端架构知识体系**,并能实际运用到自己的业务或者系统中去。
最后,给你留一个思考题吧,除了前面我提到的聊天、直播互动、物联网等这些场景,你生活中接触到的还有哪些场景,也比较适合用到即时消息技术呢?
你可以给我留言,我们一起讨论。
![](https://static001.geekbang.org/resource/image/e5/21/e565d0438340c0596f9ba9f0470e7f21.jpg)