职贝云数AI新零售门户

标题: 知乎网站构架变迁 [打印本页]

作者: taojin168    时间: 2022-12-31 11:47
标题: 知乎网站构架变迁
知乎是一个真实的网络问答社区,社区氛围敌对与感性,衔接各行各业的精英。用户分享着彼此的专业知识、阅历和见解,为中文互联网源源不断地提供高质量的信息。
也许很多人还不知道,知乎在规模上是仅次于百度贴吧和豆瓣的中文互联网最大的UGC(用户生成内容)社区。知乎创业三年来,从0末尾,到如今曾经有了100多台服务器。目前知乎的注册用户超过了1100万,每个月有超过8000万人运用;网站每个月的PV超过2.2亿,差不多每秒钟的动态央求超过2500。
在ArchSummit北京2014大会上,知乎结合创始人兼 CTO 李申申带来了知乎创业三年多来的初次片面技术分享。
初期架构选型
在2010年10月真正末尾动手做知乎这个产品时,包含李申申在内,最后只要两位工程师;到2010年12月份上线时,工程师是四个。
知乎的主力开发言语是Python。由于Python简单且弱小,可以疾速上手,开发效率高,而且社区活跃,团队成员也比较喜欢。
知乎运用的是Tornado框架。由于它支持异步,很合适做实时comet运用,而且简单轻量,学习成本低,再就是有FriendFeed 的成熟案例,Facebook 的社区支持。知乎的产品有个特性,就是希望跟阅读器端建立一个长衔接,便于实时推送Feed和告诉,所以Tornado比较合适。
最后整个团队的精神全部放在产品功能的开发上,而其他方面,基本上能节约工夫、能省的都用最简单的方法来处理,当然这在后期也带来了一些成绩。
最后的想法是用云主机,节省成本。知乎的第一台服务器是512MB内存的Linode主机。但是网站上线后,内测受欢迎程度超出预期,很多用户反馈网站很慢。跨国网络延迟比想象的要大,特别是国内的网络不平衡,全国各地用户访问的状况都不太一样。这个成绩,再加受骗时要做域名备案,知乎又回到了本人买机器找机房的老路上。
买了机器、找了机房之后又遇到了新的成绩,服务常常宕掉。当时服务商的机器内存总是出成绩,动不动就重启。终于有一次机器宕掉起不来了,这时知乎就做了Web和数据库的高可用。创业就是这样一个状况,永远不知道明早醒来的时分会面临什么样的成绩。
[img][/img]


这是当时那个阶段的架构图,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上获取。
[img][/img]


详细细节如下图所示:
[img][/img]


知乎还基于Kids做了一个Web小工具(Kids Explorer),支持实时看线上日志,如今曾经成为调试线上成绩最次要的工具。
Kids曾经开源,放到了Github上。
事情驱动的架构
知乎这个产品有一个特点,最早在添加一个答案后,后续的操作其实只要更新告诉、更新动 态。但是随着整个功能的添加,又多出了一些更新索引、更新计数、内容审查等操作,后续操作五花八门。假如按照传统方式,维护逻辑会越来越庞大,维护性也会 非常差。这种场景很合适事情驱动方式,所以开发团队对整个架构做了调整,做了事情驱动的架构。
这时首先需求的是一个音讯队列,它应该可以获取到各种各样的事情,而且对分歧性有很高的 要求。针对这个需求,知乎开发了一个叫Sink的小工具。它拿到音讯后,先做本地的保存、持久化,然后再把音讯分发出去。假如那台机器挂掉了,重启时可以 残缺恢复,确保音讯不会丢失。然后它经过Miller开发框架,把音讯放到义务队列。Sink更像是串行音讯订阅服务,但义务需求并行化处理, Beanstalkd就派上了用场,由其对义务停止全周期管理。架构如下图所示:
[img][/img]


举例而言,假如如今有用户回答了成绩,首先系统会把成绩写到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密集、计算密集的操作,比如答案格式的定义、解析等。通道服务的特点是没有存储,更多是做一个转发,比如说Sink。
[img][/img]


这是引入服务化之后全体的架构。
[img][/img]


产品服务
知乎首页,大致有四个功能区。在左侧,是“最新动态”,大约占到首页70%版面,次要呈现用户所关注人的最新发问及回答等信息。用户在这一版块,除了查看最新成绩及回答之外,也
可以经过“设置”、“关注成绩”、“添加评论”“分享”、“感激”和“收藏”等功能参与到本人感兴味的成绩中。如应用“设置”功能,用户可以选择屏蔽话题。在所关注用户关注成绩下,也可以对该成绩添加关注、添加评论等行为。
在首页右上方版面,是用户在知乎网相关行为管理信息。有“我的草稿”、“我的收藏”、“一切成绩”、“我关注的成绩”和“约请我回答的成绩”。 在右侧中间地位,是网外约请功能——“约请好友加入知乎”。在这个版块中,用户可以经过电子邮件和新浪微博约请本人冤家加入到知乎社区中。 在右侧中下方,为用户关注或感兴味话题或用户引荐板块。话题和用户引荐上,知乎运营方一方面能够根据用户关注话题信息汇总,一方面能够经过用户在知乎网络相关行为数据记录统计,达到相当准确引荐和汇总。同时,尤为一提的是,右下方的“话题广场”板块中,知乎网将一切话题分类标签呈现,为用户除搜索和导航之外,有一种不错的获取信息方式。
知乎话题页,可以分为两个板块,如图2所示,一个是“话题动态”,一个是“常去话题”。在左侧为“话题动态”信息,占到版面大约70%。在这一板块中,用户可以对所关注话题下成绩(按工夫顺序呈现)点击查看,也可以对所关注话题停止“固定”和“取消关注”操作。
在右下方,是“常去话题”版面。在这一版面中,用户可以了解到所关注话题详细诸如子话题、关注人数和动态等信息。
知乎告诉页,可以分为四个版面,如图3所示。左侧“全部告诉”为用户关注成绩为其他用户回答信息(按工夫先后顺序呈现)。右侧,用户行为数据汇总、“约请好友加入知乎”、话题及话题引荐版面等,和首页引见一样,这里不再赘述。
知乎个人主页大致分为5个版面:“个人材料”、“个人回答”、“个人主页”、“搜索用户成绩和答案”、“关注人和被关注信息”和“关注话题”。详细如图4所示。
在“个人材料”版面,用户可以经过点击“查看详细材料”查看用户“个人成就”(包括获得“赞同”数量、“感激”数量、“收藏”数量和“分享”数量)、“职业阅历“、”寓居信息“、”教育阅历“、”擅长技能“5个方面信息。假如是知乎用户,可以经过点击”编辑我的材料“完善以上5个方面信息。
左下方,为“个人回答“版面,是用户对相关成绩回答信息(按照赞同数量降序陈列或按照回答工夫顺序由近到远陈列)。以上”个人材料“和”个人回答“两个版面能占到整个70%地位。
在右上方,为“个人主页“版面,是对知乎最新动态,用户提的成绩、回答、收藏和日志信息汇总。
右侧中间地位,是一个搜索框。用户可以经过这个搜索框查询详细用户的成绩和回答内容。
右侧中下方,分别是用户个人关注人或被关注和关注话题信息。用户可以经过点击相关图标,一键衔接详细板块中。
知乎成绩页面——是知乎最次要的页面。在这里用户可以了解、编辑、回答详细成绩和信息,
知乎这一版面,按照功能大致可以分为六个部分,即“成绩回答”、“关注功能”、“约请功能”、“相关成绩链接”、“分享功能”和“成绩形态”。
在左侧地位,为“成绩回答”版面,占到这一板块大约70%地位。在这一板块的版面中,用户可以对相关成绩停止修正、评论、告发和管理投票。 用户可以对本人觉得不合适成绩、成绩标签和成绩补充停止修正。同时,假如发现不合适或本人感兴味成绩,用户也可以评论或告发。在成绩回答上,用户可以按照相当合适本人方式对成绩回答进
行排序操作(知乎提供按投票排序、按工夫排序和按用户关注人显示三种内容呈现方式)。
除此,值得一提的是每个回答左侧有分别代表赞同和反对一上一下两个三角形,如图6所示。用户可以根据本人知识了解角度或兴味对成绩回答停止个性化管理。
在这一板块右侧,由上到下首先是“关注”功能。这一功能板块中,用户可以对成绩停止关注,这有点像新浪微博关注功能,不同的是,知乎关注次要针对详细成绩,而新浪微博次要针对详细用户。
右侧再向下,是“约请别人回答成绩”版面。这和后面“知乎首页”和“知乎告诉”板块引见功能一样,这里不再赘述。
再向下,是与成绩相关各个成绩。这也是大多数网站系统引荐方式的一种。虽然这一种引荐方式在技术和阅历上相对比较成熟,但效果上并不是达到毫无挑剔程度。知乎在成绩相关成绩链接方面,次要是针对详细成绩特点,经过相应算法停止机器引荐,并没有做到针对不同用户爱好个性引荐效果(这也是将来互联网发展趋向,电子商务平台更为关注这一技术)。
再向下,便是成绩分享功能。用户可以将知乎成绩经过“微博“和”邮件“停止站外分享和经过“站内私信”停止站内分享。
在右侧最下方地位,便是成绩形态。在这一版面中,用户可以了解成绩最近活动发生工夫,被阅读次数、相关话题关注者人数和该成绩关注人数信息。
用户体验
1、 准确地讲,知乎更像一个论坛:用户围绕着某一感兴味的话题停止相关的讨论,同时你可以关注和你兴味分歧的人。对于概念性的解释,网络百科几乎涵盖了你一切的疑问;但是对于发散思想的整合,却是知乎的一大特征。知乎鼓励在问答过程中停止讨论,以拓宽成绩的发散性。鼓励答案的非针对性,鼓励答案的Wiki可参考性。
2、比论坛愈加具有排他性,在知乎的每一个注册用户都有一个PR(Person Rank),你的每一个操作都将直接影响你个人的PR 值。在回答的时分,答案顺序按赞同票数排序,赞同票数相反的状况下按个人PR值排序,同时隐藏被以为有效的答案。这在一定程度上过滤了相当的渣滓信息。
3、知乎曾经坚持严厉的约请制度,一来是为了确保用户准实名身份的真实性,二来避免产生过多的渣滓信息。准实名可以方便用户有的放矢的向你感兴味的人提出疑问,这是当初韩寒流产的《独唱团》中有一个相当有意思的栏目,“一切人问一切人”,换句话说,这就是理想版的知乎。同时,知乎严厉的约请制度也使知乎覆盖着浓郁的严谨氛围,以keso为代表,不言则已,一言服人。
自2013年3月起,知乎向公众开放注册。
4、以信誉为基础的SNS关系。能够单纯作为SNS与问答的整合,国内人人网应该更能疾速发展;但是正如前文所说,严厉的约请制度,排挤了相当一部分有效信息;假如人人网亦推出社会化问答,那必然会整合你原先的好友,而这部分好友显然不能够都是对你的关注点感兴味的人。这也几乎否定了任何大型互联网公司进军Quora类问答的能够性。
由于大型互联网公司受众普遍广泛,而Quora类问答并不是单纯以人气为基础的,而是价值信息比(价值信息/总信息量),也就是精英信息产生量。
不过千橡旗下低调推出经纬网,作为垂直SNS聚集了相当数目的职业人,假使千橡以此为契合点,整合类Quora问答,还是相当有潜力的。
5、与Quora相比,知乎以蓝色为基调。相比与Quora,知乎功能还是有待完善,比如某一话题下最佳话题。
[img][/img]


本文原创发布php中文网,转载请注明出处,感激您的尊重!





欢迎光临 职贝云数AI新零售门户 (https://www.taojin168.com/cloud/) Powered by Discuz! X3.5