AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

QQ 空间技术架构之深刻揭密

  • 2012-05-29
  • 本文字数:4550 字

    阅读完需:约 15 分钟

编者按:由 InfoQ 主办的全球架构师峰会将于2012 年8 月10 日-12 日在深圳举行,为了更好地诠释架构的意义、方法和实践,InfoQ 中文站近期会集中发布一批与架构相关的文章,本篇即为其中之一。InfoQ 也欢迎读者亲身参与到本次全球架构师峰会中,与来自国内外的顶尖架构师进行面对面的交流。报名参会请点击这里

QQ 空间作为腾讯海量互联网服务产品,经过近七年的发展,实现了从十万级到亿级同时在线的飞跃。在这个过程中,QQ 空间团队遇到了哪些技术挑战?其站点前后台架构随着业务规模的变化又进行了怎样的演进与变迁?成长背后有过怎样的心酸和快乐……

4.26 日晚间,腾讯大讲堂·深圳首站《QQ 空间技术架构之峥嵘岁月》活动在腾讯总部腾讯大厦多功能厅举办,腾讯 Web 前端研发领域专家、腾讯最早的专职 Web 开发团队核心成员、Qzone 核心架构研发总监徐晓在两小时的演讲中揭开了 QQ 空间技术架构背后的秘密。

正式分享之前,徐晓介绍了 QQ 空间目前的海量服务数据规模(图 1):

  1. 拥有 5.5 亿的活跃用户
  2. 过万台的设备
  3. 数千万级别的同时在线
  4. 数十亿级别的全站 PV
  5. P 级的 UGC 存储量
  6. 每天千亿级别的服务请求

图 1——QQ 空间海量服务数据规模

接下来,徐晓把 QQ 空间成长和发展的历程分成三个阶段:石器时代、冷兵器时代和现代战争时代,分享了 QQ 空间从开始甚至难以生存,到逐步发展成国内最大的 SNS 社区产品背后的酸甜苦辣。

石器时代–从十万在线到百万在线

石器时代是 QQ 空间 1.0 到 3.0 稳健上线的过程。

徐晓说:“QQ 空间在石器时代遇到的最大难题就是如何生存?如何让这个襁褓中的产品活下来?如何积累第一批宝贵的用户资源?”, 2005 年 QQ 空间首发,最初是采用传统的发放邀请码的方式征集第一批用户。第一款 QQ 空间是嵌在独立的客户端软件中,看似是个客户端,其实是一个浏览器内核,里面都是 HTML 页面,以网站的方式存在。 当初的架构非常简单,采用了 Apache 搭建 Web Server,Mysql 保存最终数据。用户通过{uin}.qzone.qq.com(uin 就是用户的 QQ 号码) 这样的方式访问自己的空间。最开始上线时,仅邀请了电信用户。但上线之后才发现很多北方网通用户也非常希望来体验。但如果让北方网通用户跨网来访问电信的服务,那将是一个非常糟糕的体验。因为当时的跨网之间的带宽是非常有限的。

为了满足网通用户的需求,QQ 空间团队在网通搭建了一套与电信一模一样的服务,电信的用户数据只存在电信的服务器上,网通用户数据只存在网通服务器上。看似异地分布,其实两部分数据是互相独立、不能冗余的。在用户注册开通空间时,就确定了他的数据存在于哪个服务器上。

用户访问空间的逻辑抽象来说是这样的(如图 2):用户通过浏览器发起请求访问我们的第一个 CGI,这个 CGI 再串行的获取用户数据,比如:装扮数据,日志数据等。等获取到全部数据之后,这个 CGI 再将所有的数据拼装成一个完整的 HTML 页面输出给用户。

图 2——Qzone2.0 典型载入逻辑

但同时,空间第一版的独立客户端也带来了各种问题和烦恼:

第一:非常不利于定位问题。

一旦页面元素填写失败,定位问题将是一件麻烦的事情。因为它不是 Web 页面,所以只能用其他抓包软件,比如 Ethereal(Wireshark 的前身)来抓取网络包做分析。但那个时候网络抓包工具的能力还比较弱,没有高亮和 HTML 语法检测等功能,所以整体环境比较受限。

第二:服务接入层压力大。

由于不仅要接受用户的请求,还要向后访问不同的数据。当后端某一个接口超时严重的情况下,很多用户的请求都会被挂起。这样就会消耗更多的连接资源,对 Web 服务器 CPU 的消耗很大。

第三:服务集群没有发挥出应有的服务能力

当时共用 30-40 台服务器,也只能支持 50 万左右的用户。无奈之下,团队想了一个没办法的办法:有意限制超过五十万用户,提出了一个排队等待机制,学习海底捞模式,当在线人数达到 50w 的时候,QQ 空间会给用户展示一个 Flash 小游戏,让用户在等待的时候玩小游戏。

针对当时存在的种种问题,团队做了以下改进来解决:

第一:采用 Web RIA。

当时大量使用了 Ajax 技术来减轻服务器的负载。其中一个极端的例子是:整个空间首页都是采用 JS 绘制,这样能够将用户访问的 CGI 足够轻量化。尽量简化了 CGI 逻辑,让 CGI 程序运行更加强壮、效率更高。同时,当服务异常时,还可以通过 JS 脚本绘制一个错误信息给予用户提示。而且,采用 JS 开发效率更高,调试更方便。 Web RIA 化后,降低了服务器 CPU 消耗的 40%,节约了 DC 的输出带宽约 30%(部分 JS 脚本都可以被浏览器 Cache 住)。

第二:采用动静分离策略。

静态资源都放在自研的 Web 服务器 qhttpd 上,它具备当时 ApacheSelect 模型的两个数量级以上的接入能力。

第三:采用自研的 Web Server:Qzhttp,主要用于动态分离的动态服务的需要。

由于 Qzhttp 是腾讯自研的、轻量的、更适合业务自己逻辑的 Web Server,从而保证了它的高性能,它的接入能力比 Apache (非 FastCGI 模式) 提高了 3 倍。

石器时代做的最大的优化:

当用户申请 QQ 空间多个服务时,每个服务都有独立的存储和处理逻辑。只有当所有的服务处理完成,才会由 QQ 空间框架服务器返回给用户。这样对于同时依赖日志、相册、音乐、留言的服务就会产生两大问题:

  1. 短板效应一损俱损;
  2. 具体业务容量无法差异化。

针对这两个问题,做了首页载入性能优化及首页内容静态化系统两方面的优化:

研究用户访问模型。拉取展现与 UGC 内容的变更比例是 7:1。用户之间互访频繁,看他人与看自己的比例是 5:1.。通过以上数据,可以看出用户的 UGC 更新很少,但是用户之间互相访问很频繁。根据用户的这种访问模型,空间团队研发了一套静态化系统(图 3)。这套系统会将用户首页的内容全部 Cache,然后根据用户的访问,以及用户自己 UGC 内容的更改,采用一定策略更新静态化系统的 Cache 数据。 通过增加首页内容静态化系统,首页展现速度从 5s 提升到 3s,用户也不用再玩小游戏进行等待。同时在设备没有扩容的前提下,同时在线用户访问数突破 100w。

图 3—首页内容静态化系统

通过不断的改进和优化,QQ 空间 3.0 于 2006 年中稳健上线。

冷兵器时代——功能的磨砺

冷兵器时代是在线人数从百万阵营向千万阵营过渡的过程。这个阶段做的更多的是功能的磨砺,提高可用性的过程。

但与此同时,QQ 空间团队又面临了新的问题:

  1. 网通,教育网用户体验很差;
  2. 版本迭代快速,导致外网 bug 不断;版本发布之后,所有开发必须留守 2 个小时;
  3. 后端服务质量不稳定,导致服务经常宕机。

之前有谈到,空间的用户数据是分布在电信与网通两套体系中的。但由于公司在网通的服务设备有限,随着用户量的不断增加,很快就达到了网通设备服务的上限。网通不能扩容设备,但用户量还在不断增加。面对这种情况,只好将网通和电信的数据合并为一套。当网通用户访问服务的时候,会通过一个代理将用户的请求转发到内网电信服务上。采用这种方式,提供了一套通用的解决方案,可以解决海外,网通,教育网,铁通等运营商的问题。

但这种跨网访问的静态资源下载量非常大,静态资源请求次数 : CGI 请求数接近 10:1,所以采用 CDN 提供静态资源下载,来提高用户访问速度。具体逻辑是:根据用户客户端 IP 判断用户属于哪一个 ISP 服务商,通过 URL 方式将用户的静态资源访问定向到该 ISP 的服务设备上。

这样,跳出 CDN 系统的拘束、优化思路,解决了大部分教育网用户问题,同时多级支持的思路成为公共方案。 但同时还是有很多的故障:

  1. 低 ARPU、低成本、低价机器、大集群
  2. 版本迭代快每周发布版本
  3. 用户对故障和低效的容忍度非常低 通过调研,我们发现用户对 Web 的容忍度是很低的(如图 4):

图 4——用户容忍度曲线

一般页面在 1s 内打开,用户会感觉体验非常流畅。所以我们通过以下策略来保证服务质量:

  1. 区分关键路径, 对关键路径的服务质量我们要求 4 个 9 以上,非关键路径的服务失败之后做有损体验;
  2. 采用动态超时时间控制算法,保证整个程序在可控的时间内做出响应;
  3. 多级容错机制,从后端服务到 CGI,到前台 JS 脚本都对错误做了容错处理;
  4. 采用柔性可用策略, 失败接口采用默认数据。

为了保证版本的服务质量,空间采用了灰度发布策略。新特性可能按照用户尾号发布, 每次新特性只对一小部分人可见。一段时间内的用户反馈后,不断修复和改进问题,再逐步扩大用户群对新特性的可见性,最后新特性才对全量用户可见。同时,也通过控制 JS 版本号来达到了灰度发布的目的。

通过这些优化,QQ 空间成功踏入千万级在线的阵营,QQ 空间 5.0 正式上线。其中主要变化:后端服务进行了重构,前端页面也进行了优化。

现代战争时代–数千万在线向亿级在线

经过反复的改进和优化,QQ 空间服务质量大幅提高,但是,新的问题还是随之而来:

不满足于发日志、传照片的用户,想要玩游戏、使用某些 web 工具。同时,公司其它团队要在 QQ 空间上开发应用,但 QQ 空间的应用配置都写死在 QQ 空间平台逻辑里面。为配合其他团队上线,发版本需要一周,工作不可并行,非常耗时,受到了很大挑战。针对这种情况,我们采取了两大措施:平台和应用架构分离(如图 5)、简单配置后上线(如图 6)。

图 5——平台和应用架构分离

图 6——简单配置后上线

如果某天深圳的 IDC 不可用了怎么办?

为了解决这个问题,空间团队做了全国 IDC 的异地部署,采用“一点写,多点读”模式的架构模型,将服务部署到深圳、上海、天津和西安。深圳是一个写入点,通过 QQ 空间自己的一套同步系统同步到全国各个 IDC(如图 7)。同时 QQ 空间提供了全方位的立体监控,7*24 小时对服务做监控。

图 7——IDC 分布

如何快速发现和解决用户的问题?

定位用户问题需要花很大的时间成本,这就要求团队做很多的监控工作:服务器流量监控、接口调用监控、前端测速监控、前端调用错误监控。

同时,在千万级到亿级在线的过程中,团队要有全国甚至全球的分布和匹配分布的运营能力;出问题可以快速切割,全方位的立体化监控能力;各个逻辑层持续优化能力。只有持续优化,用户才能感知到性能的增加,用户才会增加。

经过无数次的推敲和不断优化,QQ 空间的服务能力已经能够支持千万级别的用户在线请求,并且能够给用户提供 7*24 小时的不间断服务。向亿级在线阵营冲刺也将指日可待!

总结

百万在线:

当时如何撑住服务,让用户进来,从而积累 QQ 空间第一批用户,根据用户模型进行优化,让 QQ 空间架构有更好的接入能力,做到高性能。

千万在线:

通过各层的柔性服务和灰度发布的策略,让服务更加稳定,让用户数量级再上一个新台阶。

亿级在线:

服务要有更灵活、更敏捷的变更手段。同时有更好的监控和可运营的能力。

接下来是半个小时的 Q&A 环节,同学们踊跃提问,徐晓做出了详细专业的解答。最后,徐晓和大家分享了“腾讯《海量服务之道》系列的优质课程和秉承的原则”:

Qzone 是全球第二大 SNS 社区,仅次于 Facebook。徐晓说:“海量服务的价值观和用户对我们的厚爱造就了现在的 QQ 空间。我们会持续的发展,攻克各种难题,不断前进。”

4 月 26 日 21:00,两个小时的 QQ 空间技术架构分享圆满结束!

欢迎大家继续期待腾讯大讲堂对外讲座·第八期《云网络能带给我们什么》 。更多精彩,尽在腾讯大讲堂: DJT.QQ.COM


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-05-29 00:0019478

评论

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

如何高效使用YashanDB PL语言?这5点建议值得收藏

YashanDB

数据库 数据库系统 yashandb 崖山数据库

小间距LED显示屏:安防监控的未来趋势

Dylan

科技 LED LED display LED显示屏 市场

阿里云人工智能平台PAI论文入选OSDI '24

阿里云大数据AI技术

人工智能 论文 大模型 大语言模型 OSDI

HBase 在统一内容平台业务的优化实践

vivo互联网技术

HBase 连接池预热 compact优化

文献解读-多组学-第十八期|《整合 WES 和 RNA-Seq 数据以进行短变异发现》

INSVAST

基因数据分析 生信服务

探索大模型:袋鼠云在 Text To SQL 上的实践与优化

袋鼠云数栈

sql 大数据 数据中台 AI 大模型

Easysearch 数据可视化和管理平台:INFINI Console 使用介绍

极限实验室

console easysearch 极限科技

基于Rspack实现大仓应用构建提效实践|得物技术

得物技术

最佳实践 企业号2024年7月PK榜 Rspack 前端大仓

十大 Feature:腾讯云数据仓库TCHouse-D 2.0内核引擎全新升级

腾讯云大数据

TCHouse

观测云产品更新 | 视图变量、仪表板、监控通知对象、日志索引等

观测云

监控 日志

优秀的程序员都有的十条特征,你中了几条?

禅道项目管理

项目管理 程序员 软件开发 项目管理软件

华为云IoT端到端灰度发布,如何实现海量用户业务平稳过渡升级

华为云开发者联盟

微服务 物联网 华为云 华为云开发者联盟 企业号2024年7月PK榜

fm足球经理Football Manager 2022 for mac 下载安装包

你的猪会飞吗

Mac游戏下载

火山引擎×威科:拥抱大模型,法律行业信息库建设再提效

新消费日报

中国在GenAI应用方面位列全球第一!马斯克取消100亿美元Oracle服务器交易,准备自己整活!|AI日报

可信AI进展

人工智能

彻底解决网络哈希冲突,百度百舸的高性能网络 HPN 落地实践

百度Geek说

网络 哈希 企业号2024年7月PK榜

揭秘”大模型加速器”如何助力大模型应用

袁袁袁袁满

人工智能

特权账号管不好,“删库跑路”防不住

芯盾时代

iam 删库保护 特权账号管理

1688跨境寻源通系统案例:rakumart日本市场1688代采集运系统搭建

tbapi

1688代采系统 1688代采 1688代购系统 1688寻源通 1688寻源通系统

INFINI Easysearch 尝鲜 Hands on

极限实验室

console easysearch 极限科技 征文系列

MySQL派生表合并优化的原理和实现

华为云开发者联盟

MySQL 数据库 华为云 华为云开发者联盟 企业号2024年7月PK榜

本周六!上海场新能源汽车数据基础设施专场 Meetup 来了

Greptime 格睿科技

数据库 大数据 开源 汽车 新能源

乘用车1-5月销量同比增长7%,火山引擎数据飞轮能帮车企盘活下半年增长吗?

字节跳动数据平台

大数据 数字化转型 云服务 火山引擎 数据飞轮

深入解析 MS404:基于 ERC404 标准的独特原生资产

NFT Research

NFT ERC404

携手并进 共创未来丨东软睿驰与中国移动上海产业研究院达成战略合作

科技热闻

“离职员工”试图打包资料带走,如何防止敏感数据外泄?

极盾科技

数据安全

公共安全和应急管理系统:提升社区韧性与危机应对能力

天津汇柏科技有限公司

安全 应急响应

Sentieon Arm版本:进一步降低基因组计算成本

INSVAST

基因数据分析 生信服务

京东.Vision首登苹果Vision Pro 背后的技术探索

京东零售技术

Vision pro 企业号2024年7月PK榜

好玩的卡牌游戏推荐:堆叠大陆 Stacklands(Win/Mac)中文版

你的猪会飞吗

Mac游戏推荐 Mac游戏分享

QQ空间技术架构之深刻揭密_架构_张英_InfoQ精选文章