程序员 google Windows nginx 开源 java apache mysql Ubuntu Firefox 微软 linux命令 linux Python shell Android wordpress centos HTML5 php

Quora使用到的技术

以前向大家介绍过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

延伸阅读

  • 抱歉,暂无相关内容!

评论