转--《从0到100:知乎网站架构变迁史 》

初期架构选型

在2010年10月真正开始动手做知乎这个产品时,包含李申申在内,最初只有两位工程师;到2010年12月份上线时,工程师是四个。

知乎的主力开发语言是Python。因为Python简单且强大,能够快速上手,开发效率高,而且社区活跃,团队成员也比较喜欢。

知乎使用的是Tornado框架。因为它支持异步,很适合做实时comet应用,而且简单轻量,学习成本低,再就是有FriendFeed 的成熟案例,Facebook 的社区支持。知乎的产品有个特性,就是希望跟浏览器端建立一个长连接,便于实时推送Feed和通知,所以Tornado比较合适。

最初整个团队的精力全部放在产品功能的开发上,而其他方面,基本上能节约时间、能省的都用最简单的方法来解决,当然这在后期也带来了一些问题。

最初的想法是用云主机,节省成本。知乎的第一台服务器是512MB内存的Linode主机。但是网站上线后,内测受欢迎程度超出预期,很多用户反馈网站很慢。跨国网络延迟比想象的要大,特别是国内的网络不均衡,全国各地用户访问的情况都不太一样。这个问题,再加上当时要做域名备案,知乎又回到了自己买机器找机房的老路上。

买了机器、找了机房之后又遇到了新的问题,服务经常宕掉。当时服务商的机器内存总是出问题,动不动就重启。终于有一次机器宕掉起不来了,这时知乎就做了Web和数据库的高可用创业就是这样一个情况,永远不知道明早醒来的时候会面临什么样的问题。

这是当时那个阶段的架构图,Web和数据库都做了主从。当时的图片服务托管在又拍云上。 除了主从,为了性能更好还做了读写分离。为解决同步问题,又添加了一个服务器来跑离线脚本,避免对线上服务造成响应延迟。另外,为改进内网的吞吐量延迟, 还更换了设备,使整个内网的吞吐量翻了20倍。

在2011年上半年时,知乎对Redis已经很依赖。除了最开始的队列、搜索在用,后来像Cache也开始使用,单机存储成为瓶颈,所以引入了分片,同时做了一致性。

知乎团队是一个很相信工具的团队,相信工具可以提升效率。工具其实是一个过程,工具并没有所谓的最好的工具,只有最适合的工具。而且它是在整个过程中,随着整个状态的变化、环境的变化在不断发生变化的。知乎自己开发或使用过的工具包括Profiling(函数级追踪请求,分析调优)、Werkzeug(方便调试的工具)、Puppet(配置管理)和Shipit(一键上线或回滚)等。

日志系统

知乎最初是邀请制的,2011年下半年,知乎上线了申请注册,没有邀请码的用户也可以通过填写一些资料申请注册知乎。用户量又上了一个台阶,这时就有了一些发广告的账户,需要扫除广告。日志系统的需求提上日程。

这个日志系统必须支持分布式收集、集中存储、实时、可订阅和简单等特性。当时调研了一些开源系统,比如Scribe总体不错,但是不支持订阅。Kafka是Scala开发的,但是团队在Scala方面积累较少,Flume也是类似,而且比较重。所以开发团队选择了自己开发一个日志系统——Kids(Kids Is Data Stream)。顾名思义,Kids是用来汇集各种数据流的。

Kids参考了Scribe的思路。Kdis在每台服务器上可以配置成Agent或 Server。Agent直接接受来自应用的消息,把消息汇集之后,可以打给下一个Agent或者直接打给中心Server。订阅日志时,可以从 Server上获取,也可以从中心节点的一些Agent上获取。

知乎还基于Kids做了一个Web小工具(Kids Explorer),支持实时看线上日志,现在已经成为调试线上问题最主要的工具。(Kids已经开源,Github上可见。)

事件驱动的架构

知乎这个产品有一个特点,最早在添加一个答案后,后续的操作其实只有更新通知、更新动 态。但是随着整个功能的增加,又多出了一些更新索引、更新计数、内容审查等操作,后续操作五花八门。如果按照传统方式,维护逻辑会越来越庞大,维护性也会 非常差。这种场景很适合事件驱动方式,所以开发团队对整个架构做了调整,做了事件驱动的架构。

这时首先需要的是一个消息队列,它应该可以获取到各种各样的事件,而且对一致性有很高的 要求。针对这个需求,知乎开发了一个叫Sink的小工具。它拿到消息后,先做本地的保存、持久化,然后再把消息分发出去。如果那台机器挂掉了,重启时可以 完整恢复,确保消息不会丢失。然后它通过Miller开发框架,把消息放到任务队列。Sink更像是串行消息订阅服务,但任务需要并行化处理, Beanstalkd就派上了用场,由其对任务进行全周期管理。

举例而言,如果现在有用户回答了问题,首先系统会把问题写到MySQL里面,把消息塞到Sink,然后把问题返回给用户。Sink通过Miller把任务发给 Beanstalkd,Worker自己可以找到任务并处理。

最开始上线时,每秒钟有10个消息,然后有70个任务产生。现在每秒钟有100个事件,有1500个任务产生,就是通过现在的事件驱动架构支撑的。

页面渲染优化

知乎在2013年时每天有上百万的PV,页面渲染其实是计算密集型的,另外因为要获取数据,所以也有IO密集型的特点。这时开发团队就对页面进行了组件化,还升级了数据获取机制。知乎按照整个页面组件树的结构,自上而下分层地获取数据,当上 层的数据已经获取了,下层的数据就不需要再下去了,有几层基本上就有几次数据获取。

结合这个思路,知乎自己做了一套模板渲染开发框架——ZhihuNode

经历了一系列改进之后,页面的性能大幅度提升。问题页面从500ms 减少到150ms,Feed页面从1s减少到600ms。

面向服务的架构(SOA)

随着知乎的功能越来越庞杂,整个系统也越来越大。知乎是怎么做的服务化呢?

首先需要一个最基本的RPC框架,RPC框架也经历了好几版演进。

第一版是Wish,它是一个严格定义序列化的模型。传输层用到了STP,这是自己写的很 简单的传输协议,跑在TCP上。一开始用的还不错,因为一开始只写了一两个服务。但是随着服务增多,一些问题开始出现,首先是 ProtocolBuffer会 生成一些描述代码,很冗长,放到整个库里显得很丑陋。另外严格的定义使其不便使用。这时有位工程师开发了新的RPC框架——Snow。它使用简单的 JSON做数据序列化。但是松散的数据定义面对的问题是,比如说服务要去升级,要改写数据结构,很难知道有哪几个服务在使用,也很难通知它们,往往错误就 发生了。于是又出了第三个RPC框架,写RPC框架的工程师,希望结合前面两个框架的特点,首先保持Snow简单,其次需要相对严格的序列化协议。这一版 本引入了 Apache Avro。同时加入了特别的机制,在传输层和序列化协议这一层都做成了可插拔的方式,既可以用JSON,也可以用Avro,传输层可以用STP,也可以用 二进制协议。

再就是搭了一个服务注册发现,只需要简单的定义服务的名字就可以找到服务在哪台机器上。同时,知乎也有相应的调优的工具,基于Zipkin开发了自己的 Tracing系统。

按照调用关系,知乎的服务分成了3层:聚合层、内容层和基础层。按属性又可以分成3类:数据服务、逻辑服务和通道服务。数据服务主要是一些要做特殊数据类型的存储,比如图片服务。逻辑服务更多的是CPU密集、计算密集的操作,比如答案格式的定义、解析等。通道服务的特点是没有存储,更多是做一个转发。

原文链接:https://mp.weixin.qq.com/s?__biz=MjM5NTg2NTU0Ng==&mid=403282668&idx=3&sn=c9d5c13f797adfde514c144e8f1cfce0&scene=21#wechat_redirect

原文地址:https://www.cnblogs.com/wjwjs/p/11053772.html

时间: 2024-08-05 19:05:43

转--《从0到100:知乎网站架构变迁史 》的相关文章

[转]《鸟人》

以下来自豆瓣影评 0. 饰演主角Riggan的,正是多年前饰演过<蝙蝠侠>和<蝙蝠侠归来>的Keaton 1. 电影的一大主题,就是演员们极度稀薄的安全感,以及对于接受和肯定的“瘾”.这些演员都有着不同形式的自我痴迷. Keaton不停地跟自己的阴暗面斗嘴,一方面要关心自己话剧的质量,担忧别人对自己作为艺术家的看法,一方面又愤怒地“唏嘘”当年老子多辉煌,你们这帮人算个毛!老子可以拍“Birdman 4”发大财!当明明已经开始做话剧了,好好表演完成任务却不够,他又特别容易被外界干扰到

【谜院群】2017年3月24日鸟人素素主擂谜会题

[谜院群]2017年3月24日鸟人素素主擂谜会题 1.三月踏青携友旅(2字著名鱼具品牌)千又2.花开映日,淡化听莺语(8笔字)英3.垄上幽篁皆破土(同义字二)龙.皇4.前庭柳垂杏花度(14笔字)嘛5.莫道桃源晚归处(7笔字)沐6.风光几回,半遮绿岗路(2字词汇)网络7.紫陌孤行鸟语稠(央视主持人)路一鸣8.斜阳西下月初露(2字词汇)斗胆9.前坡银桃早烂漫(5字常言)金木水火土10.伊人花容,回顾门中见(2字古文常用疑问词)问君11.余留心迹成绝恋(10笔字)途12.空怀旧日同思念(5笔字)司13

2014鸟人Birdman中文字幕文件下载

下载后,解压缩,会得到 Birdman.2014.1080p.WEB-DL.DD5.1.H264-RARBG.srt 文件,把这个文件放到视频文件(mkv文件)相同的文件夹里. 用暴风影音播放,如果没有显示中文字幕,需要用播放器的“选择字幕”的菜单选择这个srt文件(播放器里点击右键,选择字幕,找到srt文件即可). 点击下载:Birdman.2014.1080p.WEB-DL.DD5.1.H264-RARBG.zip

编程模拟自然(九):元胞自动机

序 旧书有云:发鸠之山,其上多柘木.有鸟焉,其状如乌,文首.白喙.赤足,名曰精卫,其鸣自詨. 一日,精卫游于码海,溺而不返,后常衔西山之木石,以堙于海.有诗为证: 万事有不平,尔何空自苦: 长将一寸身,衔木到终古? 我愿平码海,身沉心不改: 码海无平期,我心无绝时. 呜呼!君不见,西山衔木众鸟多,鹊来燕去自成窠! (前情提要:主角元乘坐返回舱降落到了码海上,随后遇到了个鸟人...) “咳咳,远道的客人,我名精卫XIV,乃是先祖精卫鸟的第十四代后裔...”鸟人作自我介绍 “...你是谁,从哪里来又

商代王后妇好、玉器及特展相关资料整理

1.展览的相关说明 展览: 玉鸣锵锵--商代王后妇好玉器特展 时间: 2016.12.27-2017.3.26 地点: 三楼书画厅 本展览为收费展览,全票30元,半票15元. 半票优惠人群: 教师.学生.军人(购票时出示相关证件:60岁以上老人(购票时出示身份证或老人证):1.2-1.4米儿童:20人以上团体. 免票范围: 1.2米以下小童(需在成人陪同下参观):博物馆同行.博物馆协会成员(检票时出示相关证件):残障人士(检票时出示相关证件). 2.展览分为五个部分 第一部分:"发现妇好&quo

新年最新的100句超牛的语言(转)

1.二农戏猪 2.干掉鸟人我就是天使! 3.帅有个屁用!到头来还不是被卒吃掉! 4.好好活着,因为我们会死很久!!! 5.有没有听过“大猪说有,小猪说没有”的故事? 6.女友问我她死了我会怎样我坚定的说:我不会独活(再找一个活)她大悦~! 7.人工智能和天然愚蠢无法相提并论——因为我们主张纯天然. 8.在教堂听讲经的时候我们应该保持肃静,打扰别人睡觉是很不礼貌的. 9.陪聊,提供夜间上门服务.(一个墓志铭) 10.人又不聪明,还学人家秃顶!! 11.你是电,李四光,你是唯一的神话… 12.笨人的

高中时候经常说的口头禅

1.靠!不服!2.不搞了不搞了!3.……我跟你说!4.我打死你!5.鸟人!6.无聊!7.干嘛!8.不可能!9.我拍死你!10.你滚啊!11.谁稀罕啊!12.……你头!13.打把鬼!14.谁说的!15.过来单挑!16.什!17.很多人都这么说!18.开玩笑!19.要定!20.是不是找打啊!21.叉!22.不是吧!23.考就考,有什么大不了!24.干!25.是啊是啊!26.怎么可能?27.羡慕吧!28.你再吵,吵什么吵!29.什么奇葩都有!30.操!31.一般般啦!32.随便!33.叫你……你又不听

绕过HR破门而入的求职智慧

以往我们在网上看到的很多求职文章或指导性纲领,譬如啥自信.做功课.良好形象.华丽的简历.工作经验.口才啥的,其实到了21世纪尤其是互联网高速发展的今天,前面这些技巧就显得无比空洞: 1.因为自信谁都可以做到哪怕装都能装出来 2.简历,谁都可以用各种模板来打造,至于说HR们是否看到华丽的简历就立刻对你打100分这也是有扯淡嫌疑的 3.良好形象.一般来说主要是衣着得体.气质不俗,长得好看不好看已经不怎么重要了,长得好看只能说明你大学时期课外生活也许很丰富,长得不好看也不代表你一定是个很努力的人 4.

【原创】win10下搭建vue开发环境+IIS部署

[原创]win10下搭建vue开发环境 如果要转发,请注明原作者和原产地,谢谢! 特别说明:下面任何命令都是在windows的命令行工具下进行输入,打开命令行工具的快捷方式如下图: 详细的安装步骤如下: 一.安装node.js 说明:安装node.js的windows版本后,会自动安装好node以及包管理工具npm,我们后续的安装将依赖npm工具. node.js的官方地址为:https://nodejs.org/en/download/,如下图所示: 根据自己电脑的具体配置,选择你要下载的安装

《设计你的人生》的部分经典语录

每个优秀的人,都有一段沉默的时光.在那一段时光,你付出了很多努力,忍受孤独和寂寞,不抱怨不诉苦,最后渡过了这段感动自己的日子. ——苏引华<设计你的人生>很多人在开始梦想时发现别人己经实现了自己要实现的梦想,于是就开始怀疑自己追不上了于是就放弃了梦想,最终成为了普通人!——苏引华<设计你的人生>很多人没有成功并不是他不能成功,而是他根本没有想过要成功或如何成功,生命当中有很多事情最初拥有的只是梦想,以及豪无根据的自信而己,但是,所有的一切,都从这里出发!——苏引华<设计你的人