即时消息技术剖析与实战
袁武林
微博研发中心技术专家
立即订阅
6503 人已学习
课程目录
已完结 24 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 搞懂“实时交互”的IM技术,将会有什么新机遇?
免费
基础篇 (8讲)
01 | 架构与特性:一个完整的IM系统是怎样的?
02 | 消息收发架构:为你的App,加上实时通信功能
03 | 轮询与长连接:如何解决消息的实时到达问题?
04 | ACK机制:如何保证消息的可靠投递?
05 | 消息序号生成器:如何保证你的消息不会乱序?
06 | HttpDNS和TLS:你的消息聊天真的安全吗?
07 | 分布式锁和原子性:你看到的未读消息提醒是真的吗?
08 | 智能心跳机制:解决网络的不确定性
场景篇 (4讲)
09 | 分布式一致性:让你的消息支持多终端漫游
10 | 自动智能扩缩容:直播互动场景中峰值流量的应对
11 | 期中实战:动手写一个简易版的IM系统
12 | 服务高可用:保证核心链路稳定性的流控和熔断机制
进阶篇 (10讲)
13 | HTTP Tunnel:复杂网络下消息通道高可用设计的思考
14 | 分片上传:如何让你的图片、音视频消息发送得更快?
15 | CDN加速:如何让你的图片、视频、语音消息浏览播放不卡?
16 | APNs:聊一聊第三方系统级消息通道的事
17 | Cache:多级缓存架构在消息系统中的应用
18 | Docker容器化:说一说IM系统中模块水平扩展的实现
19 | 端到端Trace:消息收发链路的监控体系搭建
20 | 存储和并发:万人群聊系统设计中的几个难点
21 | 期末实战:为你的简约版IM系统,加上功能
22 | 答疑解惑:不同即时消息场景下架构实现上的异同
结束语 (1讲)
结束语 | 真正的高贵,不是优于别人,而是优于过去的自己
即时消息技术剖析与实战
登录|注册

开篇词 | 搞懂“实时交互”的IM技术,将会有什么新机遇?

袁武林 2019-08-26
00:00
13:14
讲述:袁武林 大小:12.13M
你好,我是袁武林。我来自新浪微博,目前在微博主要负责消息箱和直播互动相关的业务。接下来的一段时间,我会给你带来一个即时消息技术方面的专栏课程。
你可能会很好奇,为什么是来自微博的技术人来讲这个课程,微博会用到 IM 的技术吗?
在我回答之前,先请你思考一个问题:
除了 QQ 和微信,你知道还有什么 App 会用到即时(实时)消息技术吗?
其实,除了 QQ 和微信外,陌陌、抖音等直播业务为主的 App 也都深度用到了 IM 相关的技术。
比如在线学习软件中的“实时在线白板”,导航打车软件中的“实时位置共享”,以及和我们生活密切相关的智能家居的“远程控制”,也都会通过 IM 技术来提升人和人、人和物的实时互动性。
我觉得可以这么理解:包括聊天、直播、在线客服、物联网等这些业务领域在内,所有需要“实时互动”“高实时性”的场景,都需要、也应该用到 IM 技术。
微博因为其多重的业务需求,在许多业务中都应用到了 IM 技术,目前除了我负责的消息箱和直播互动业务外,还有其他业务也逐渐来通过我们的 IM 通用服务,提升各自业务的用户体验。
为什么这么多场景都用到了 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 技术是众多前后端技术的一个综合体,只不过和其它业务相比,由于自身使用场景在某些技术点上有更多侧重。
在整个 IM 系统的实现上深度用到了网络、数据库、缓存、加密、消息队列等后端必备知识。架构设计中也在大规模分布式、高并发、一致性架构设计等方面有众多成熟的解决方案。
所以我们可以认为,在学习和实践 IM 技术的过程中,也可以系统化提升你在这些方面的整体能力。
我第一次接触 IM 系统并不是和“人”相关的场景,当时就职的公司做的是一个类似“物联网”的油罐车实时追踪控制系统,一是通过 GPS 实时跟踪油罐车的位置,判断是否按常规路线行进,一是在油罐车到达目的地之后,通过系统远程控制开锁。
所以,这里的交互实际是“车”和“系统”的互动,当然这个系统实现上并没有多大的技术挑战,除了 GPS 的漂移纠偏带来了一些小小的困扰,最大的挑战莫过于调试的时候需要现场跟车调试多地奔波。
再后来,由于工作的变动,我逐渐接触到 IM 系统中一些高并发的业务场景千万级实时在线用户,百亿级消息下推量,突发热点的直线峰值等。一步一步的踩坑和重构,除了感受到压力之外,对 IM 系统也有了更深层次的理解。
记得几年前,由于消息图片服务稳定性不好,图片消息的渲染比较慢,用户体验不好。
而且,由于图片流和文本流在同一个 TCP 通道,TCP 的阻塞有时还会影响文本消息的收发。
所以后来我们对通道进行了一次拆分,把图片、文件等二进制流拆到一个独立通道,核心通道只推缩略图流,大幅减轻了通道压力,提升了核心链路的稳定性。
同时,独立的通道也缩短了客户端到文件流的链路,这样也提升了图片的访问性能。
但后来视频功能上线后,我们发现视频的 PSR1(1 秒内播放成功率)比较低,原因是视频文件一般比较大,为避免通道阻塞,不会通过消息收发的核心通道来推送。
所以之前的策略是:通过消息通道只下推视频的 ID,用户真正点击播放时才从服务端下载,这种模式虽然解决了通道阻塞的问题,但“播放时再下载”容易出现卡顿的情况。
因此,针对视频类消息,我们增加了一个 notify-pull 模式,当客户端收到一条视频类消息的通知时,会再向服务器发起一个短连接的拉取请求,缓冲前 N 秒的数据。
这样等用户点击播放时,基本就能秒播了,较大地提升了视频消息播放的 PSR1(1 秒内播放成功率)。
因此,我们要打造一套“实时、安全、稳定”的 IM 系统,我们需要深入思考很多个地方,尤其是作为整个实时互动业务的基础设施,扩展性、可用性、安全性等方面都需要有较高的保障。
比如下面几种情况。
某个明星忽然开直播了,在线用户数和消息数瞬间暴涨,该如何应对?
弱网情况下,怎么解决消息收发失败的问题,提升消息到达率?
如何避免敏感聊天内容由于网络劫持而泄露?
诸如此类的问题可能有很多种解决方案,但是对于不同的场景适用的方案可能也不一样。
因此在随后的内容里,我希望能够先系统化地带着你了解一下,一套基础的 IM 系统的整体构成,以及不同业务场景下可能存在的问题点和瓶颈点。
然后,我会从经验角度出发来和你一起深入探讨这些问题,并在这一过程中尽量遵循解决问题的 3W 原则(What、Why、How)。从问题现象出发,结构化分析问题的本质原因,并讨论多种解决问题的优劣和选择。
我希望能通过这样的方式,不仅让你对 IM 的核心组成有一个整体的认识,而且能够在各个瓶颈点的分析和后续的实践中,形成较为深刻的思考和实践能力,逐渐完善自身关于 IM 系统架构的知识网络。

课程设置

我们的课程分成三个模块,基本思路是:先从整体了解、再细化到每个垂直领域去了解它们有什么不同,进而关注到一些实现上的关键技术点、然后再回归到整体面。

基础篇

本模块我们会开始学习一个即时消息系统的基础结构,以及如何为你的 App 加入即时消息的模块。并且,我们会从即时消息系统所适用的业务场景需求出发,学习 IM 有别于其他业务系统的特性功能,比如实时性、安全性,以及这些功能的具体实现。

场景篇

在场景篇里,我会挑选即时消息技术的几个具体应用场景,这些场景相对个性化,而且在某些特性的技术实现上有一定挑战,我会针对这些场景比较核心的重点和难点来进行拆分讲解。比如,消息的多终端漫游功能的实现重点,以及直播互动场景中峰值流量的应对等等。

进阶篇

进阶篇在基础篇的即时消息的基础能力之上,介绍了相对更高级一些的功能,比如和苹果的推送服务对接。另外也更多关注于即时消息场景里在海量消息、高并发、服务高可用、服务保障等方面的优化实践,这部分内容具备较强的通用性,适用于大部分后端服务架构,从事后端服务开发设计的同学应该都会有所收获。
我希望能通过这个专栏,把这些年积累到的一些一线的实战经验进行梳理和沉淀,让感兴趣的小伙伴从中真正了解到,在超大用户规模的场景下,我们的即时消息系统经常会碰到的一些问题和容易出现瓶颈的环节,以及最终如何通过技术的升级和架构上的优化,来一一化解。
另外我希望你在掌握即时消息技术的同时,还能从这些实际上适用于大部分互联网后端业务的技术点和架构思想中,能体会到技术的互通性,通过思考和沉淀,形成自己的一套后端架构知识体系,并能实际运用到自己的业务或者系统中去。
最后,给你留一个思考题吧,除了前面我提到的聊天、直播互动、物联网等这些场景,你生活中接触到的还有哪些场景,也比较适合用到即时消息技术呢?
你可以给我留言,我们一起讨论。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《即时消息技术剖析与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(62)

  • C家族铁粉
    下午好,能否说一下具体用到的技术和编程语言呢~

    作者回复: 你好,im实际上是众多技术的组合,包括但不限于:网络,分布式应用,数据库,缓存,系统高可用等等。期中和期末测试会使用java来演示如何搭建一套im系统

    2019-08-26
    4
    41
  • felix
    telegram为什么可以支持几万人的群?它和微信有哪些技术上的不同点?

    作者回复: 这是个好问题,万人群聊系统的难点以及应对方案在课程里都会详细介绍,一起来学习吧

    2019-08-26
    4
    20
  • 德德
    期待Go语言的示例

    作者回复: 会有java版本的实战演示,个人觉得语言不是重点哈,关键是思路

    2019-08-26
    1
    15
  • A2020
    开一个git仓库,java的为演示版,其他语言的版本,可交由学员来完成,不知道这种方式是否可行

    作者回复: 哈哈,是个好办法,我们考虑一下。感谢!

    2019-08-27
    13
  • Geek_4587d5
    大神好,这个课程实例主要用什么语言开发

    作者回复: 你好,考虑到语言普及性,课程实例会使用java来演示

    2019-08-26
    8
  • Flourishing
    老师,希望您看到了回复一下。感觉这个系统涉及的后端知识挺多的,我看课程的篇幅只有22课时,内容只是大体范围讲解一下嘛?

    作者回复: 你好,主要是从即时消息的具体场景出发,把im最特性和场景中容易碰到的问题来展开讲解,其中会涉及到一些通用的后端技术,学完相信你收货的不仅仅是im相关的知识。

    2019-08-26
    1
    6
  • 恰同学少年
    老师,课程中会有阅读回执多端登录的讲解与实战吗?

    作者回复: 多终端消息漫游是im系统中较为高级的功能,课程里面会详细讲到这一块的难点和相应的方案

    2019-08-27
    5
  • leslie
    有以下几个问题需要老师解答一下:
    1.这门课会可以使用或者说涉及的编程语言是什么,掌握程度是什么
    2.老师提到了消息队列:那么会使用哪种现有的消息队列,还是基于消息队列原理自己写一个简单的消息队列
    3.操作系统:消息队列目前似乎都是基于linux;极客时间里面有《消息队列高手》和《kafka核心技术和编程》,关于消息队列和操作系统需要掌握到哪个程度
    4.网络协议:常规的协议明白以及会抓包就行了还是
    麻烦老师对于上述4个问题做个解答:以便对后面的课程学习可以做好相应的准备,谢谢。

    作者回复: 这几个问题我来回答一下哈:
    1. 课程里面会安排使用java来实现一个简单的IM系统,基本上懂java语法就行。
    2. 消息队列在课程里主要用于模块间解耦,用来说明在架构设计时起到的作用,消息队列不是课程重点讲解的部分,不会涉及到具体使用的队列,了解消息队列的作用就可以啦。(在我们自己的业务里用到了kafka、memcacheq)
    3. 操作系统层面没有太多要求,如果对网络IO这一块有一定的了解会更好。
    4. 网络协议里面主要会比较多涉及到TCP协议、Http协议的一些特性,比如TCP的ACK机制,TCP的序号和重传机制,如果对这些能有提前掌握能帮助更好的理解课程内容。谢谢!

    2019-08-27
    4
  • 泽宾
    如何解决安卓系统的实时推送呢,现在各个手机os厂商都不允许服务在后台一直运行,如何解决呢

    作者回复: 是个好问题,android的实时推送确实是业界一个比较热门的话题,答案就在课程中哦

    2019-08-26
    2
    4
  • 许童童
    希望通过专栏的学习,可以打造一套线上可用的,适合创业公司的IM系统。

    作者回复: 可以的,有问题可以随时多交流

    2019-08-26
    1
    4
  • Daydayup
    建议写IM系统的时候,有一个仓库地址,大家可以提出自己的意见
    2019-08-28
    3
  • Jason
    MQTT与IM的优劣

    作者回复: MQTT是IM系统中一种常见消息传输协议,和其他协议的区别答案就在课程里哦

    2019-08-26
    3
  • null
    老师,您好!
    从语言特性考虑,go 会比 java 更适合用来开发 IM 么?

    作者回复: 哈哈,又要引起一起语言大战啦。个人感觉是各有优势吧,性能方面都没有问题哈,golang的协程在处理io上会让代码编写更加优雅,但IM整体实现上除了io其实还有很多业务逻辑需要处理的,这个时候就得看语言整体的生态系统了,感觉这方面java目前会更有优势一些。所以,选啥语言看具体开发人员的知识储备就行啦

    2019-08-27
    1
    2
  • hanqian
    有用到哪些技术以及编程语言可以先说明下?

    作者回复: 即使消息技术实际上是众多前后端技术的组合,包括但不限于:网络,分布式应用,db,缓存,安全,服务高可用等等,专栏会用java完成一个简单im系统的搭建。

    2019-08-26
    1
    2
  • 痞子胥
    php技术 可以跟着 这个课程 改动搭建个吗? 之前用php 的扩展 swoole 技术 也做过。不知道有啥区别。。

    作者回复: 没问题的呀,实现的语言不是问题,重要的是思路。

    2019-09-14
    1
  • bobby
    请问老师,文中您遇到的gps偏移怎么解决的,我们现在也遇到了这种场景。谢谢!

    作者回复: 哈哈,每个地图厂家都会有测绘局分派给这个厂家的偏移量和规则,这些厂家会把这个纠偏放到自己地图的SDK,用他们提供的SDK一般就可以了。

    2019-09-09
    1
  • 探索无止境
    期待能够讲解的方案有落地的实现,有编码的讲解,这样收获会更大
    2019-08-28
    1
  • 姜戈
    很期待~~~~
    2019-08-27
    1
  • lorancechen
    老师您好,我所在的传统行业有自己的业务特性,咨询两个问题:
    1 早上9点钟上班,有2万用户同时登录,如何处理这种登录风暴?
    2 内部微服务业务改造,但是接口功能

    作者回复: 这个和直播业务里的突发峰值场景比较类似,会在场景篇里说一说如何应对这种峰值流量。

    2019-08-27
    1
    1
  • 太多的借口
    希望您能讲解下海量连接的管理,最好结合微信QQ,a用户给b用户发了一条消息,流程是什么样的,谢谢~

    作者回复: 课程里面都会有哦

    2019-08-26
    1
收起评论
62
61
返回
顶部