01 | 架构与特性:一个完整的IM系统是怎样的?
01 | 架构与特性:一个完整的IM系统是怎样的?
讲述:袁武林
时长14:47大小13.54M
从一个简单的聊天系统说起
1. 使用者眼中的聊天系统
2. 开发者眼中的聊天系统
IM 系统都有哪些特性?
1. 实时性
2. 可靠性
3. 一致性
4. 安全性
小结
赞 20
提建议
精选留言(55)
- 恰同学少年2019-08-28存储在服务端的作用: 1.会话一方用户不在线,上线时进行消息推送。 2.内容审查,监管,电子证据,法律要求。 3.数据分析,舆情分析。 暂时想到这些😊 是否要在服务端存储消息还是由业务与法律法规所决定的。展开
作者回复: 👍
42 - newzai2019-08-29业务模块与接入模块的通信链路是如何设计的。接入模块收到一个消息后,通过什么方式,udp,or tcp等推送到业务模块?业务模块下发消息给用户时,怎么知道用户处于接入模块的那一个实例服务(接入模块肯定是有多个实例同时运行的)
作者回复: 1. 接入层和业务层可以通过rpc或者mq来进行对接。 2. 推送时,可以在用户上线时维护一个全局的uid到接入网关的映射来做到定向推送,对于超大群或者直播互动场景可以不区分某一个用户落在哪个接入网关,而是让所有网关获取后来下推连到本机的用户。你想想这种方式的优势是什么呢?
共 7 条评论11 - summer2019-08-29问题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存储。
共 2 条评论9 - QQ怪2019-08-28腾讯的微信好像是不存服务器的,但我觉得估计是存了的,只是没开放给我们9
- 云师兄2019-08-28存储在客户端,多终端登录时候如何同步(历史)消息的?
作者回复: 是个好问题,如果消息只存储在客户端,实现多终端消息同步基本上就会非常困难。
6 - 蒙2019-11-22想比其他专供大厂面试的课程,这个实战的im是真的符合我的口味哈哈哈,买对课程了,im不仅仅是im,里面的技术可以营销平台,网关等出现
作者回复: 感谢支持
5 - Curry2019-08-28我觉得即时消息可以放到MQ中,或者缓存中,使用数据抽取工具周期性的将数据提交服务器,进行持久化。服务器存储历史数据和近实时的数据。
作者回复: 对,你说的这种方式其实是通过队列来异步化解耦消息存储逻辑。
6 - 许童童2019-08-28思考题:我觉得是需要的,如果消息接受方不在线,消息总要有一个地方存储,不是存服务器就是存发送方,存发送方显然是不行的,因为那就相当于没有发送。所以最终还是要存到服务器的,但存储形式不限于存储服务,可以是去中心化的,或者是一种缓存机制只保存几天。
作者回复: 是的,服务端可以只是维护一个用于暂存消息和信令的离线buffer,至于存多久和产品需求以及监管需求相关。
5 - 一步2019-08-28接入服务层是不是就相当于网关层服务的?
作者回复: 对,是指网关层服务。
共 2 条评论5 - 漩涡鸣人2019-08-29对im很感兴趣,给老师点个赞✺◟(∗❛ัᴗ❛ั∗)◞✺4
- 东林路易斯2019-08-28存不存看需求吧。 1. 消息一定要经过服务端进行过滤验证的,用异步存储性能消耗也不大。 2. 只是存着拿来做什么,多端消息记录同步?历史记录搜索? 3. 多端同步会容易导致设备本地消息记录冲突混乱吧?历史记录搜索也不现实,数据量太大但使用率太低,有点浪费资源。 4. 就算存起来可能真的拿来自己玩,不可能对外提供服务的。例如不合法言论多重扫描鉴别,纠纷记录凭证,大数据进行关键词热点分析等等各种不可描述的商业操作。展开
作者回复: 嗯,也要考虑监管方面的需求,多端同步方案合理的话不会导致冲突。
共 2 条评论4 - 影随2019-10-26老师您好,我这边有个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都需要接收同样的消息,可以让接入服务器通过消息队列来订阅业务层产生的所有消息就可以啦,就不需要业务层找机器了。
共 2 条评论3 - javaworker2019-08-28老师讲的很棒啊,豁然开朗,公司以前就是做及时通讯的,前些年公司产品活跃用户很高,后来被微信打败了,哎,老同事都说公司及时通讯架构太老了,听老师一讲,各个部分都能对上号,很期待后面的课程,辛苦老师啦3
- 冷笑的花猫2019-08-28请问后续老师会逐一用代码或者伪代码分解这些知识点吗?架构图会不会讲解?毕竟只是文字的话不是那么好理解,谢谢。
作者回复: 期中左右会有一个简单版的IM的代码实现,架构图的我尽量去细化的讲,大家有问题的也可以随时给我留言提问。
3 - sam2019-08-28微信没有将消息存储在服务器上; Telegram将消息存储在服务器上了; 要不要进行服务端存储考虑的因素有哪些?我想产品根据自身特性和存储成本等因素来考量吧 有一个说法是(不知是否真假),腾讯不想承担大量消息存储的硬件成本,而选择不在服务端存储消息。展开
作者回复: 服务端存储需要更多考虑成本和数据安全,也和产品定位有关,比如不需要支持消息多终端同步的应用,可以不在服务端进行存储。当然,还需要考虑国内监管机制是否允许的问题。
共 9 条评论3 - 0xTang2020-03-28接入服务和业务服务的通信,可以有几个,同步的有http和rpc,异步的可以使用mq共 1 条评论3
- 行云2019-09-05数据还是要存的,用途很多,比如分析,监管调取等。有个问题,如果接入层只做接入,怎么在长链接中原路返回业务响应呢?
作者回复: 有session维护就可以做到:知道这个用户的连接在哪台网关机上,这样处理完之后就能通过session进行response回推了。
2 - 楠木2019-08-29老师 你好,这个可以做基于web网页的即时通讯功能吗
作者回复: web端也是可以的呀,思路是一样的,现在H5支持的很好了,websocket基本是标配,也是长连接的支持服务端推送的。
共 2 条评论2 - ly2019-08-29感觉IM消息的几点特性和MQ的相似,什么可靠性、顺序性、一致性,都好像。可能实现的手段应该都是类似的。 另外咨询一下老师,接入层是不是主要就是对用户的socket进行持有,包括收发请求等,最近在学网络编程、nio这一块的东西,所以对这一层特感兴趣! 一般情况下,消息是可以不储存的,例如一般的QQ用户,只会存在客户端,但是有个开通漫游消息的付费功能,这个功能应该是会储存消息的。总体还是看业务需求吧!展开
作者回复: 1. 是,接入层指的是客户端连接的网关服务,一般用于连接保持、编解码、session维护等。 2. 接收方不在线时是需要服务端进行消息和信令暂存的,存多久由产品需求和监管需求决定。
2 - leslie2019-08-28对于老师的问题:个人觉得不一定;看实际需求。 1.一些临时会话,g统消息完全没必要保留许多天,几天就足够了 3.系统架构和服务器情况:如果只是传统的CS或BS架构没办法;可是当使用了内存库和消息队列之后,内存容易足够大的情况下完全可以只把部分消息存入服务器存储 这是个人对学习的一些见解:请老师提点。
作者回复: 个人觉得倒是和是否是CS、BS架构关系不太大,这个主要还是看产品层面的需求吧,不考虑监管的情况下,如果产品层面不需要支持消息多终端同步,服务端可以只对接收到的消息和信令进行短时间的暂存(比如几天),有终端上线取走后就删掉;对于需要支持多终端消息同步的场景,有一端取走后消息还是需要保留一定时间。另外,用户量小、保留时间短的话这个buffer可以放内存。
2