Quora使用到的技术,本文主要参考了Phi


以前向大家介绍过Stack Exchange 的系统架构和Facebook 的系统架构,今天和大家说说Quora 的。本文主要参考了Phil Whelan 的这篇文章《Quora’s Technology Examined》。关于Quora 是个什么网站我就不多说了,国内对他的C2C 网站叫“知乎”。呵呵。我们还是来看看Quora 的技术吧。

Search-Box

Quora 只能搜索问题,主题标签,用户名,和主题标题。没有全文搜索,所以,你无法搜索问题和答案的内容。而搜索中使用前缀搜索方式,比如你输入mi,则Microsoft 会马上出来。其搜索还会有一些非常简单的模糊匹配的算法。另外,如果有重复的问题,其中一个问题会自动跳转到另一个问题,但是在搜索中还是会出现。搜索中没有拼写检查。一开始,他们使用的是一个开源的搜索服务器,叫Sphinx。其支持上述的那些功能。现在他们不用这个技术了,因为受到了一些限制。他们做了一个比较新的解决方案,这个算法由Python 实现。

Amazon Web service

Quora 全部host 在AWS 的EC2 和S3 上,这对于这些刚刚起步的快速发展的公司非常关键,因为你可以省去了很多硬件和维护的成本。(建一个数据中心并不是所有公司都能干的事)。Quora 的操作系统使用UbuntuLinux,这是非常容易部署和管理。其静态页使用了Amazon 的CDN 的 Cloudfront 服务分发,CloudFront 用于所有的静态图片, CSS 和JavaScript。图片先传到 EC2 服务器,使用Pyhon S3 API 处理后后传到 S3。

HAProxy Load-Balancing

HAProxy 作为前端负载均衡服务器,反向代理服务器是 Nginx,Nginx 后面则是 Pylons (Pylons + paste) , 承担动态 Web 请求。Pylons,是一个轻量级的Web 框架,通常都是在Nginx 后面使用。选用Pylons 就像你在春节用饺子当主食一样。他们把Pylons 中的template 和ORM 取走而使用自己的技术(由Python写成),这个地方就是 LiveNode 和WebNode2 的地方。

Thrift

Thrift 用于后端服务器间的通讯。Thrift 服务由 C++ 开发。Facebook 同样使用了这个技术。

Tornado

Tornado web 框架用于实时更新,其运行在Comet 服务器上,其用来处理大量的需要长时间poll 和push 更新的网络连接。

Long Polling (Comet)

Quora 的网页并不是简单的显示,每一个页面都需要更新,或是创建问题,答案和评论。所以,他们使用了Long Polling 而不是传统的Polling,传统的Polling 需要浏览器一端不停地重复地向服务器询问——“有更新吗?”,服务器说没有,于是过一会浏览器再问,现在呢?服务器说,还是没有,浏览器过一会又问,现在呢?服务器说,还没好。这样一来,就好像让我们的客户端放到了驾驶室里,这显然是有问题的,因为只有服务器知道什么时候会有更新。而且浏览器这么干,很快会让服务器的负载加上去。

Long polling 也就是我们熟知的 Comet,其让服务器来控制这些事,让客户端等在那里听服务器的响应。在client 和 server 的会话对于两者是相同的,而不是client 需要等着然后向服务器查询。服务器端可以把一个连接打开很长时间(比如:60 秒),在这段时间里,服务器会查看是否有相应的东西需要更新,如果有的话,就发给浏览器。如果没有的话,就等下一次的client 询问。可见,这种服务器等一会再响应的方法可以让浏览器少发几次查询。

对于long-polli ng 的最好的地方是,可以降低浏览器和客户端间来来回回的次数。让服务器端来控制时间,所以,内容更新可能会只是几个毫秒,或是几十秒。服务器端也可以积攒一堆更新后,一次发给浏览器。这样做会更有效率。

但是,这个方法的黑暗面是——这会让服务器端出现大量的TCP 链接,想一想,Quora 也是百万级用户的应用了,只需要10% 的在线用户,你就需要一个可以处理10 万并发量的架构。注意,如果一个用户在其浏览器里打开了多个Quora 网页的话,那么,这个链接器会是非常致命的。

当然,好的消息是已经有一些技术专门为Long Polling 设计,这些技术可以让你在那些等待的连接中只会消耗非常非常少的内存(因为那些等待连接并不需要所有的资源)。例如:Nginx 是一个单线程的事件驱动的小型服务器,每一个链接只花非常小的内存。每一个Nginx 的进程只会在一个时候处理一个连接。这意味着其很容易扩展成一个可以处理成千上的并发量的服务架构。

mysql

就像Adam D’Angelo 的老东家facebook 一样,Quora 重度使用MySQL。他们的行事原则是,尽可能的把数据放在一台机器上,使用hash 主键把大规模的数据存放到多个数据库中。坚决不用表连接。Adam 参考了FriendFeed 的一篇文章How FriendFeed uses MySQL to store schema-lessdata,并说你不应该在你的社区还没有100 万用户的时候使用NoSQL 数据库。

并不只是Quora 和FriendFeed 使用MySQL,Google,Twitter,Facebook 都在使用MySQL.

Memcached

Memcached 用于 MySQL 的前端缓存。

Git

Git 是他们的源码版本控制工具.

Charlie Cheever 遵从 “14 Rules for Faster-Loading Web Sites”

Steve Souders, High Performance Web Sites 和 Even Faster WebSites 的作者,其列了一些 rules 让你网页更快的原则。 Charlie Cheever 的Quora 创始人提到这些过,这应该也是Quora 的速度的原因。

“One resource we used as a guide is Steve Souders’ list of rules forhigh performance websites:http://stevesouders.com/hpws/rules.PHP”

本文有删节,完整内容见原文:
http://coolshell.cn/articles/4939.html
英文原文:Quora's Technology Examined

相关内容