在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

从手机 QQ 技术发展,看架构设计核心 3 原则

  • 2019-05-16
  • 本文字数:1498 字

    阅读完需:约 5 分钟

从手机QQ技术发展,看架构设计核心3原则

《从 0 开始学架构》专栏的第 8 期,我介绍了架构设计的三条核心原则:合适原则、简单原则和演化原则。我们在架构设计实践中,应该时刻谨记这三条设计原则,指导我们设计出合适的架构。即使是代表中国互联网技术最顶尖水平的 BAT,其架构的发展历程也同样遵循这三条原则。今天我就以大家耳熟能详的手机 QQ 作为案例,来简单分析一下。


注:以下内容部分摘自《QQ 1.4 亿在线背后的故事》。


手机 QQ 的发展历程按照用户规模可以粗略划分为 4 个阶段:十万级、百万级、千万级、亿级,不同的用户规模,IM 后台的架构也不同,而且基本上都是用户规模先上去,然后产生各种问题,倒逼技术架构升级。

1. 十万级 IM 1.X

最开始的手机 QQ 后台是这样的,可以说是简单得不能再简单、普通得不能再普通的一个架构了,因为当时业务刚开始,架构设计遵循的是“合适原则”和“简单原则”。


2. 百万级 IM 2.X

随着业务发展到 2001 年,QQ 同时在线人数也突破了一百万。第一代架构很简单,明显不可能支撑百万级的用户规模,主要的问题有:


  • 以接入服务器的内存为例,单个在线用户的存储量约为 2KB,索引和在线状态为 50 字节,好友表 400 个好友 × 5 字节 / 好友 = 2000 字节,大致来说,2GB 内存只能支持一百万在线用户。

  • CPU/ 网卡包量和流量 / 交换机流量等瓶颈。

  • 单台服务器支撑不下所有在线用户 / 注册用户。


于是针对这些问题做架构改造,按照“演化原则”的指导进行了重构,重构的方案相比现在来说也还是简单得多,因此当时做架构设计时也遵循了“合适原则”和“简单原则”。IM 2.X 的最终架构如图所示。


3. 千万级 IM 3.X

业务发展到 2005 年,QQ 同时在线人数突破了一千万。第二代架构支撑百万级用户是没问题的,但支撑千万级用户又会产生新问题,表现有:


  • 同步流量太大,状态同步服务器遇到单机瓶颈。

  • 所有在线用户的在线状态信息量太大,单台接入服务器存不下,如果在线数进一步增加,甚至单台状态同步服务器也存不下。

  • 单台状态同步服务器支撑不下所有在线用户。

  • 单台接入服务器支撑不下所有在线用户的在线状态信息。


针对这些问题,架构需要继续改造升级,再一次“演化”。IM 3.X 的最终架构如下图,可以看到这次的方案相比之前的方案来说并不简单了,这是业务特性决定的。


4. 亿级 IM 4.X

业务发展到 2010 年 3 月,QQ 同时在线人数过亿。第三代架构此时也不适应了,主要问题有:


  • 灵活性很差,比如“昵称”长度增加一半,需要两个月;增加“故乡”字段,需要两个月;最大好友数从 500 变成 1000,需要三个月。

  • 无法支撑某些关键功能,比如好友数上万、隐私权限控制、PC QQ 与手机 QQ 不可互踢、微信与 QQ 互通、异地容灾。


除了不适应,还有一个更严重的问题:


IM 后台从 1.0 到 3.5 都是在原来基础上做改造升级的,但是持续打补丁已经难以支撑亿级在线,IM 后台 4.0 必须从头开始,重新设计实现!


这里再次遵循了“演化原则”,决定重新打造一个这么复杂的系统,不得不佩服当时决策人的勇气和魄力!


重新设计的 IM 4.0 架构如图所示,和之前的架构相比,架构本身都拆分为两个主要的架构:存储架构和通信架构。


  • 存储架构



  • 通信架构



作者寄语:


每个程序员都有成为架构师的梦想,程序员成长也绕不开架构设计。在专栏中,我从架构基础、三大架构模式和实战的角度分享一整套架构设计方法论。照着做,你也能成为架构师。专栏共 50 期,已更新完毕。目前有超过 3 万人加入学习,互动留言字数超过 20 万。期待你的加入!


作者简介:


《从 0 开始学架构》专栏作者,资深技术专家李运华,目前带领多个研发团队,承担架构设计、架构重构、技术团队管理、技术培训等职责,曾就职于华为和 UCWeb,写过《面向对象葵花宝典》一书。


内容选自极客时间《从 0 开始学架构》专栏


2019-05-16 15:0414222

评论

发布
暂无评论
发现更多内容

怎么购买公有云?具体流程是怎样?

行云管家

云计算 公有云 企业上云 云管理

我摊牌了!真正的灰度队列实现方案!全网你都搜不到!

艾小仙

Java kafka RabbitMQ 中间件 计算中间件

以太网数据链路层、Ethernet_II帧格式、IEEE802.3帧格式,以太网的MAC地址的组成,ARP地址解析协议的工作原理,单播帧、组播帧、广播帧的区别

Python-派大星

10月月更

一文带你走进C++【内存泄漏】

C++后台开发

c++ 后端开发 内存泄漏 Linux服务器开发 C++开发

鏖战 48 小时,TiDB Hackathon 都诞生了哪些硬核创意?

PingCAP

TiDB

js裁剪(分隔)字符串常用方法

木偶

JavaScript 前端 10月月更

C++中的四种类型转换

可口也可樂

c++ 类型转换 10月月更

完整议程 | 2022 XDR网络安全运营新理念峰会

未来智安XDR SEC

网络安全

深入浅出来谈谈webpack🔥

渔戈

前端 Vue3 10月月更

未来智安2周年 | 行则将至,未来可期

未来智安XDR SEC

华为云网站安全解决方案,站在企业安全的最前沿

科技之光

TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式

Python-派大星

10月月更

“程”风破浪的开发者|C#下WPF中实现贪吃蛇小游戏(超详细步骤附带源码)

木偶

C# 学习方法 贪吃蛇 10月月更 “程”风破浪的开发者

Flowable 服务任务执行的三种方式

江南一点雨

Java spring springboot flowable JavaEE

个人和初创企业想要搭建网站,如何挑选一台便宜合适的云主机?

京东科技开发者

云主机 网站搭建 测评 性能评测

使用Python的requests库爬取网页表情包

何极光

Python 10月月更 爬虫案例

JavaScript刷LeetCode心得

js2030code

JavaScript LeetCode

华为云加固企业网站安全堤坝,助您业务稳定流畅

科技之光

Internet协议栈 TCP/IP模型 、以太网封装以及解封装过程、物理层、链路层、网络层、传输层、应用层的作用 OSI七层模型

Python-派大星

10月月更

算术四则混合运算表达式的求值

可口也可樂

算法 10月月更 四则运算

大咖说·小码王|人工智能时代,如何让孩子掌握与机器交流的语言?

大咖说

人工智能 阿里云 降本增效

认识VueCLI和Vite🔥

渔戈

前端 Vue3 10月月更

训练大模型的九大深度学习库;谷歌转向文字→视频生成的两大利器|AI系统前沿动态

OneFlow

人工智能 深度学习

JavaScript刷LeetCode模板技巧篇(一)

Geek_07a724

JavaScript LeetCode

嵌入式 Linux 入门 环境篇(一、开发板初体验)

矜辰所致

Linux 开发板 启动流程 10月月更

华为云同步科技信息端,海量存储性能

爱尚科技

华为云

Linux网络-HTTP协议

可口也可樂

Linux 网络协议 HTTP 10月月更

Vue3组件开发之:父子组件之间的通信方式🔥

渔戈

前端 Vue3 10月月更

「云渲染」渲染农场的架构原理、特点

Finovy Cloud

架构 原理 云渲染 云渲染农场

蒙牛前数科部总监刘瑞宝分享蒙牛数字化转型成果-星策社区大咖说(一)

星策开源社区

决策 智能化转型 数据链路 蒙牛

华为云焕新数字生活,打造情景化智能产业链条

爱尚科技

华为云

从手机QQ技术发展,看架构设计核心3原则_架构_李运华_InfoQ精选文章