期中测试答案|这些问题你都答对了吗?
陈现麟
该思维导图由 AI 生成,仅供参考
你好,我是陈现麟。
在上周的期中测试环节,我留了一道 IM 系统的架构设计题,相信你一定进行了深入的思考,可能还产生了一些疑问。那么在本节课中,我就来详细地解答一下,如何依据业务和架构的需求来设计一个 IM 系统。
问题回顾
首先,我们来回顾一下 IM 系统的业务和架构方面的需求。
业务上的需求:
支持单聊。
100 个人以内的群聊。
峰值同时在线 1000 w。
峰值发送消息 10 w QPS。
架构上的需求:
开发模式简单,新功能支持快速迭代。
长连接支持就近接入和负载均衡。
分层设计。
在功能迭代上线的时候,不要影响到用户已经建立好的长连接。
发送消息的接口是幂等的。
问题解析
基于这些业务和架构上的需求,我完成了一个架构设计,具体见下图。接下来,我们就基于这个设计图来回答期中测试的问题。这里要特别说明一点,如果你的架构设计和我的不一样,也不一定就是错了。我们在做架构设计的时候,都是在不断地做 trade-off,很多方案没有绝对的对与错,只有深入理解业务,才能做出更适合业务场景的架构设计。
1.IM 系统一般都会涉及基于 TCP 的长连接通道和基于 HTTP(S) 的短连接通道,你认为长连接通道和短连接通道的职责分别是什么?
长连接在客户端和服务器端都需要维护状态,并且消息是异步收发的,我们对长连接的设计应该尽量简单,而短连接可以理解为无状态的,并且请求是同步处理的,方便去完成一些复杂的功能,所以我认为一个比较好的职责划分方式是:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
陈现麟老师在本文中详细解答了针对期中测试中的IM系统架构设计题的问题。文章首先回顾了IM系统的业务和架构需求,包括支持单聊、100人以内的群聊、峰值同时在线1000万人、峰值发送消息10万QPS等业务需求,以及开发模式简单、长连接支持就近接入和负载均衡、分层设计、功能迭代上线不影响用户已建立长连接、发送消息接口幂等等架构需求。接着,陈现麟老师详细解答了如何依据业务和架构的需求来设计一个IM系统,包括架构设计的关键考虑点和解决方案。通过本文,读者可以快速了解IM系统的业务和架构需求,以及如何设计满足这些需求的系统架构,对于从事相关领域的技术人员具有很高的参考价值。文章内容详实,涵盖了IM系统架构设计的多个方面,包括长连接通道和短连接通道的职责分工、就近接入和负载均衡的设计、系统分层架构、功能迭代上线不影响用户已建立长连接的解决方案、消息扩散模式选择、消息发送接口的幂等性保障、系统限流策略以及机器资源需求估算等内容。整体而言,本文为读者提供了全面的IM系统架构设计思路和解决方案,对于技术人员具有很高的实践参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出分布式技术原理》,新⼈⾸单¥59
《深入浅出分布式技术原理》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- steven老师,有点疑问,感觉这个im层的算法不太对,如果峰值发送消息是10w,我们得假设一个比例才行,根据业务实际情况来进行评估,比如telegram 偏重群聊,微信可能五五开,大家在群聊的时间应该是60%,假设常规一点的应该是50%,那么10万条消息的下推的qps应该是: 5w * 1 + 5w *平均群聊人数,平均群聊人数也可以和实际业务结合,假设平均都是小群,30人左右(应该结合业务估算),那么下推qps: 5w+ 5w*30 =135w左右才对。不知道我这么算对不对
作者回复: 对的,非常赞! 由于这个是非常业务的特点,所以课程中就没有展开说了,以我自己的使用习惯估算了一个比率。
2022-03-243 - Geek_7c1d70发送消息是否可以走长链方式? tcp效率高于http
作者回复: 是的,可以走长连接发送 http 协议要简单些,效率上,http 底层也是 tcp,可以开启 keep-alive
2022-05-181 - 威老师你好,请问IM里“信令”要怎样理解,相应除了“信令”,还有哪些其他类型的消息
作者回复: 信令是指通知类的消息,用于服务器主动通知客户端的,不包含消息内容,比如收到新的消息、新的好友申请等等通知。 普通的消息是指用户发送的信息内容等实际的数据内容。
2022-03-153 - 风老师,看了架构图有几点疑问请问下 1.第5点将uid与长链接id绑定是客户端登录后做的操作吧,那绑定后的映射关系应该存储到内部路由服务中啊,那箭头是不是指错了? 2.im建立长连接就是为了发送消息的实时性啊,怎么第6点用户发送消息还要通过网关服务,直接用长连接发送不好吗? 3.第2点中客户端通过外部路由服务来获取长连接的ip列表,这是通过http请求来下发的,而且客户端不止要IP也要端口吧,那么直接把长连接服务器的IP和端口都暴露给客户端会不会有安全隐患?2022-05-3011
- peter请教老师几个问题: Q1:长短连接的具体实现方式? 用Java语言,长、短连接具体是怎么实现的? New Socket()就是长连接吗?那短连接呢? Q2:长、短连接有框架吗? 长、短连接的管理,有框架吗?线程池有框架,长、短连接也应该有框架吧。 Q3:本设计有源码吗?有开源的IM源码吗? 本文中的设计,有对应的源码吗?应该是没有的,这样的话,请问有比较好的开源IM源码吗? Q4:长、短连接都可以通过http、https实现吗? Q5:CPU和内存的比例关系是经验公式吗? 文中有这句话:“CPU:因为接入层为 IO 密集型服务,所以 CPU 和内存的配比为 1:1,CPU 为 32 核”,请问这是一个经验公式吗? 如果是计算密集型服务,CPU和内存应该是什么比例关系?2022-03-15
收起评论