深入浅出分布式技术原理
陈现麟
伴鱼技术中台负责人,前小米工程师
21241 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
深入浅出分布式技术原理
15
15
1.0x
00:00/00:00
登录|注册

期中测试答案|这些问题你都答对了吗?

UID + DID + 时间戳 + 自增计数
根据业务需求调整
动态生成消息列表
适用于大规模粉丝场景
用户收件箱模式
适用于单聊和小群聊
API提供
业务逻辑处理
内部路由服务
Push服务
网关服务
长连接服务
外部路由服务
同步请求处理
无状态
业务通道
异步消息收发
状态维护
信令通道
交流与反馈
认真复习
温故而知新
查漏补缺
IM层资源配置
Push层资源配置
接入层资源配置
网络连通性预案
DNS解析优化
网关服务或IM服务限流
Push层限流
接入层限流
消息幂等性处理
至少一次消息传递
唯一ID生成
混合模式
读扩散
写扩散
IM层
Push层
接入层
短连接通道
长连接通道
发送消息接口幂等
功能迭代不影响已建立长连接
分层设计
长连接支持就近接入和负载均衡
开发模式简单,快速迭代
峰值发送消息10w QPS
峰值同时在线1000w
支持100人以内群聊
支持单聊
学习建议
机器资源估算
连接成功率提升
限流策略
消息幂等性
消息扩散模式
分层架构
架构设计
架构需求
业务需求
IM 系统架构设计总结

该思维导图由 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
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • steven
    老师,有点疑问,感觉这个im层的算法不太对,如果峰值发送消息是10w,我们得假设一个比例才行,根据业务实际情况来进行评估,比如telegram 偏重群聊,微信可能五五开,大家在群聊的时间应该是60%,假设常规一点的应该是50%,那么10万条消息的下推的qps应该是: 5w * 1 + 5w *平均群聊人数,平均群聊人数也可以和实际业务结合,假设平均都是小群,30人左右(应该结合业务估算),那么下推qps: 5w+ 5w*30 =135w左右才对。不知道我这么算对不对

    作者回复: 对的,非常赞! 由于这个是非常业务的特点,所以课程中就没有展开说了,以我自己的使用习惯估算了一个比率。

    2022-03-24
    3
  • Geek_7c1d70
    发送消息是否可以走长链方式? tcp效率高于http

    作者回复: 是的,可以走长连接发送 http 协议要简单些,效率上,http 底层也是 tcp,可以开启 keep-alive

    2022-05-18
    1
  • 老师你好,请问IM里“信令”要怎样理解,相应除了“信令”,还有哪些其他类型的消息

    作者回复: 信令是指通知类的消息,用于服务器主动通知客户端的,不包含消息内容,比如收到新的消息、新的好友申请等等通知。 普通的消息是指用户发送的信息内容等实际的数据内容。

    2022-03-15
    3
  • 老师,看了架构图有几点疑问请问下 1.第5点将uid与长链接id绑定是客户端登录后做的操作吧,那绑定后的映射关系应该存储到内部路由服务中啊,那箭头是不是指错了? 2.im建立长连接就是为了发送消息的实时性啊,怎么第6点用户发送消息还要通过网关服务,直接用长连接发送不好吗? 3.第2点中客户端通过外部路由服务来获取长连接的ip列表,这是通过http请求来下发的,而且客户端不止要IP也要端口吧,那么直接把长连接服务器的IP和端口都暴露给客户端会不会有安全隐患?
    2022-05-30
    1
    1
  • 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
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部