即时消息技术剖析与实战
袁武林
微博研发中心技术专家
立即订阅
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讲)
结束语 | 真正的高贵,不是优于别人,而是优于过去的自己
即时消息技术剖析与实战
登录|注册

01 | 架构与特性:一个完整的IM系统是怎样的?

袁武林 2019-08-28
你好,我是袁武林。在接下来的一段时间里,我将和你一起探索 IM 的相关知识。今天是第一节课,我们就先从 IM 的相关概念开始着手。
说起 IM,我估计你会先愣一下,“IM 是 QQ 或者微信这样的即时聊天系统吗?它是不是很庞大,也很复杂?”
今天我们以一个简单的 App 聊天系统为例,来看下一个简单的聊天系统都有哪些构成要素,以此来了解一个完整的 IM 系统是什么样的。

从一个简单的聊天系统说起

我们可以从使用者和开发者两个角度来看一下。

1. 使用者眼中的聊天系统

如果我们站在一个使用者的角度从直观体验上来看,一个简单的聊天系统大概由以下元素组成:用户账号、账号关系、联系人列表、消息、聊天会话。我在这里画了一个简单的示意图:
这个应该不难理解,我来解释一下。
聊天的参与需要用户,所以需要有一个用户账号,用来给用户提供唯一标识,以及头像、昵称等可供设置的选项。
账号和账号之间通过某些方式(比如加好友、互粉等)构成账号间的关系链
你的好友列表或者聊天对象的列表,我们称为联系人的列表,其中你可以选择一个联系人进行聊天互动等操作。
在聊天互动这个环节产生了消息
同时你和对方之间的聊天消息记录就组成了一个聊天会话,在会话里能看到你们之间所有的互动消息。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《即时消息技术剖析与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(48)

  • 恰同学少年
    存储在服务端的作用:
    1.会话一方用户不在线,上线时进行消息推送。
    2.内容审查,监管,电子证据,法律要求。
    3.数据分析,舆情分析。
    暂时想到这些😊
    是否要在服务端存储消息还是由业务与法律法规所决定的。

    作者回复: 👍

    2019-08-28
    10
  • newzai
    业务模块与接入模块的通信链路是如何设计的。接入模块收到一个消息后,通过什么方式,udp,or tcp等推送到业务模块?业务模块下发消息给用户时,怎么知道用户处于接入模块的那一个实例服务(接入模块肯定是有多个实例同时运行的)

    作者回复: 1. 接入层和业务层可以通过rpc或者mq来进行对接。
    2. 推送时,可以在用户上线时维护一个全局的uid到接入网关的映射来做到定向推送,对于超大群或者直播互动场景可以不区分某一个用户落在哪个接入网关,而是让所有网关获取后来下推连到本机的用户。你想想这种方式的优势是什么呢?

    2019-08-29
    6
    4
  • summer
    问题1: 接入层要避免业务 如果用protobuf 怎么定义协议 避免各种业务变动影响就要把内容做抽象一些,就要用字符串 这样就失去protobuf 的效果了怎么办?
    问题2 之前问过的 想知道具体一点。是要多端同步的。 收到消息就存入mysql吗?然后在从mysql取出发给用户吗?redis,pika hbase他们的角色是什么样的?

    作者回复: 问题1接入层避免业务也可以考虑使用统一协议的header,body部分直接透传二进制,或者把body的编码分委托给其他的编解码api。另外对于pb还不够紧凑的问题可以再gzip一下后再下推客户端。
    问题2一般先落db,然后写离线buffer。db全量,buffer定长或者按时间过期。redis和pika一般比较适合做离线buffer,mysql和hbase一般由于消息的db存储。

    2019-08-29
    3
  • 漩涡鸣人
    对im很感兴趣,给老师点个赞✺◟(∗❛ัᴗ❛ั∗)◞✺
    2019-08-29
    3
  • 大瓦力
    存不存看需求吧。
    1. 消息一定要经过服务端进行过滤验证的,用异步存储性能消耗也不大。
    2. 只是存着拿来做什么,多端消息记录同步?历史记录搜索?
    3. 多端同步会容易导致设备本地消息记录冲突混乱吧?历史记录搜索也不现实,数据量太大但使用率太低,有点浪费资源。
    4. 就算存起来可能真的拿来自己玩,不可能对外提供服务的。例如不合法言论多重扫描鉴别,纠纷记录凭证,大数据进行关键词热点分析等等各种不可描述的商业操作。

    作者回复: 嗯,也要考虑监管方面的需求,多端同步方案合理的话不会导致冲突。

    2019-08-28
    1
    3
  • 许童童
    思考题:我觉得是需要的,如果消息接受方不在线,消息总要有一个地方存储,不是存服务器就是存发送方,存发送方显然是不行的,因为那就相当于没有发送。所以最终还是要存到服务器的,但存储形式不限于存储服务,可以是去中心化的,或者是一种缓存机制只保存几天。

    作者回复: 是的,服务端可以只是维护一个用于暂存消息和信令的离线buffer,至于存多久和产品需求以及监管需求相关。

    2019-08-28
    2
  • QQ怪
    腾讯的微信好像是不存服务器的,但我觉得估计是存了的,只是没开放给我们
    2019-08-28
    2
  • 云师兄
    存储在客户端,多终端登录时候如何同步(历史)消息的?

    作者回复: 是个好问题,如果消息只存储在客户端,实现多终端消息同步基本上就会非常困难。

    2019-08-28
    2
  • 一步
    接入服务层是不是就相当于网关层服务的?

    作者回复: 对,是指网关层服务。

    2019-08-28
    1
    2
  • javaworker
    老师讲的很棒啊,豁然开朗,公司以前就是做及时通讯的,前些年公司产品活跃用户很高,后来被微信打败了,哎,老同事都说公司及时通讯架构太老了,听老师一讲,各个部分都能对上号,很期待后面的课程,辛苦老师啦
    2019-08-28
    1
  • Curry
    我觉得即时消息可以放到MQ中,或者缓存中,使用数据抽取工具周期性的将数据提交服务器,进行持久化。服务器存储历史数据和近实时的数据。

    作者回复: 对,你说的这种方式其实是通过队列来异步化解耦消息存储逻辑。

    2019-08-28
    1
  • 韩博恒
    就看产品的定位,消息是否重要或有价值,有必要,还是要存,至少保证数据的持久性
    2019-08-28
    1
  • 冷笑的花猫
    请问后续老师会逐一用代码或者伪代码分解这些知识点吗?架构图会不会讲解?毕竟只是文字的话不是那么好理解,谢谢。

    作者回复: 期中左右会有一个简单版的IM的代码实现,架构图的我尽量去细化的讲,大家有问题的也可以随时给我留言提问。

    2019-08-28
    1
  • 刘天鹏
    好的吧 不然服务重启了,那些离线消息不就丢了
    2019-08-28
    1
    1
  • 勇闯天涯
    微信没有将消息存储在服务器上;
    Telegram将消息存储在服务器上了;
    要不要进行服务端存储考虑的因素有哪些?我想产品根据自身特性和存储成本等因素来考量吧
    有一个说法是(不知是否真假),腾讯不想承担大量消息存储的硬件成本,而选择不在服务端存储消息。

    作者回复: 服务端存储需要更多考虑成本和数据安全,也和产品定位有关,比如不需要支持消息多终端同步的应用,可以不在服务端进行存储。当然,还需要考虑国内监管机制是否允许的问题。

    2019-08-28
    6
    1
  • 寒冰
    传统的IM肯定是需要在服务端存储的,但是现在新的一些技术,点对点以及区块链之类的技术加入后,可以不放在服务器,去中心化,这样信息安全性更好

    作者回复: 服务端存储需要更多考虑成本和数据安全,也和产品定位有关,比如不需要支持消息多终端同步的应用,可以不在服务端进行存储。当然,还需要考虑国内监管机制是否允许的问题。

    2019-08-28
    1
    1
  • 想比其他专供大厂面试的课程,这个实战的im是真的符合我的口味哈哈哈,买对课程了,im不仅仅是im,里面的技术可以营销平台,网关等出现

    作者回复: 感谢支持

    2019-11-22
  • 疯狂咸鱼
    老师,能否从tcpip五层网络来讲下一条qq消息是如何传输的
    2019-11-11
  • 康斯坦丁

    最后,留给你一个思考题。消息一定需要在服务端的存储服务里进行存储吗?

    一定需要,一个是离线消息拉取、一个是多端漫游,一个是app重装都会导致客户端存储的消息失效

    作者回复: 这个看具体业务需要哈,有的app不需要多终端消息漫游,这种场景实际上可以不进行永久存储,只需要buffer一定时间的离线消息就可以。

    2019-11-05
  • 影随
    老师您好,我这边有个Netty做websocket服务器的问题,望您解惑,问题如下:

    用Netty创建的websocket服务,此时有Netty服务器集群,机器A,B,C
    假设客户端 m,n,x 分别这样(m-A,n-B,x-C)连上了服务器,产生一个channel 。
    如果我要通过服务器,通过后台管理系统,向m,n,x客户端一次性推送一次相同的消息。
    问题是,我需要先找到m,n,x所对应的通道机器,找到机器后再根据channel进行推送呢?还是?
    业务逻辑找机器感觉有点奇怪,望老师指点迷津。

    作者回复: 如果m n x都需要接收同样的消息,可以让接入服务器通过消息队列来订阅业务层产生的所有消息就可以啦,就不需要业务层找机器了。

    2019-10-26
收起评论
48
返回
顶部