Quora使用到的技术
本文主要参考了Phil Whelan的这篇文章《Quora’s Technology Examined》。关于Quora是个什么网站我就不多说了,国内对他的C2C网站叫“知乎”。呵呵。我们还是来看看Quora的技术吧。
Search-Box
Quora只能搜索问题,主题标签,用户名,和主题标题。没有全文搜索,所以,你无法搜索问题和答案的内容。而搜索中使用前缀搜索方式,比如你 输入mi,则Microsoft会马上出来。其搜索还会有一些非常简单的模糊匹配的算法。另外,如果有重复的问题,其中一个问题会自动跳转到另一个问题, 但是在搜索中还是会出现。搜索中没有拼写检查。
一开始,他们使用的是一个开源的搜索服务器,叫Sphinx。其支持上述的那些功能。现在他们不用这个技术了,因为受到了一些限制。他们做了一个比较新的解决方案,这个算法由Python实现。
参看:What libraries does Quora use for search?
实时查询
Quora的查询是非常高速的,其查询请求是通过AJAX的GET请求发送的,结果返回用的是JSON数据格式,但他们解析JSON是在服务器 端,而不是通过浏览器的JavaScript。这么做的原因可能是他们想高亮搜索关键词,似乎使用Client端的JavaScript非常不好做。
Quora的即时搜索好像比较暴力,如果你输入Microsoft(一共9个字符),你会看到其会像后端发送9次查询——每按一个键一次,无论你敲这个单词的速底有多快,这个事情交给服务器端来控制,所以,这样做不会让增加服务器端的负载。
Quora的搜索使用HTTP长连接,当你开始敲查询的时候,连接就建立了,这个连接会持续在那里,你下次搜索的时候会继续使用这个连接,除非你60秒没有动作了。
参看:Is Quora going to implement full-text search?
Webnode2 和 LiveNode
Webnode2 和 LiveNode 是 Quora 内部的系统,其用来管理内容。Webnode2 生成 HTML, CSS 和 JavaScript 并且和 LiveNode 紧紧地耦合在一起,Webnode2主要是用来管理内容在网页上显示的。Charlie Cheever 说,如果他可以从新开始,他 第一件事要做的就是重写整个LiveNode.
Quora的工程师看上对他们搞的这些东西非常的满意,并且 他们也在努力地找到这些东西的弱点。 有一个有意思的关于LiveNode的问题是,如果A和B同时正在看相当的一个问题,如果用户A的一些交互动作为影响B的。例如,如果A顶了一下某个答 案,那么这个答案可能会往上移动。这样的一个显示变化会通过AJAX更新B的浏览器。如果B此时展开了评论,可能会受到影响。
LiveNode 由这些东西写成:Python, C++, JavaScript. jQuery, Cython也用到了。
因为Quora 想要对他们的LiveNode开源 并准备把他们的代码分开,做这个事可能需要太多的工作和时间。
Charlie Cheever 指出 WebNode2 和 有一个叫做“free and easywebsite builder”的 Webnode 的webnode.com 没有任何的关系。
Amazon Web Service
Quora全部host在AWS的EC2和S3上,这对于这些刚刚起步的快速发展的公司非常关键,因为你可以省去了很多硬件和维护的成本。(建一个数据中心并不是所有公司都能干的事)。Quora的操作系统使用Ubuntu Linux,这是非常容易部署和管理。
其静态页使用了Amazon的CDN的 Cloudfront 服务分发,CloudFront用于所有的静态图片, CSS 和JavaScript。图片先传到 EC2 服务器,使用 Pyhon S3API 处理后后传到 S3。
HAProxy Load-Balancing
HAProxy作为前端负载均衡服务器,反向代理服务器是 Nginx,Nginx后面则是 Pylons (Pylons + Paste),承担动态 Web 请求。
Pylons,是一个轻量级的Web框架,通常都是在Nginx后面使用。选用Pylons就像你在春节先饺子当主食一样。他们把Pylons中的template和ORM取走而使用自己的技术(由Python写成),这个地方就是 LiveNode 和 WebNode2的地方。
Python
从 Faceboook 出来的 Charlie 和 Adam 选用了Python而不是PHP。正如Adam指出的——“Facebook is stuck on that for legacy reasons, not because it is the best choice right now” (Facebook使用PHP并不是因为其好,而是因为历史原因的问题),当然他们也不会使用C#,因为那样一来就会引入一堆微软的东西。当然,也不会是 Java,因为Python要比Java更容易写出代码,Scala太年轻了,还需要考验。Ruby看上来很像Python,但是他们对Ruby没有过多 的经验。最终还是Python胜出。当然,他们知道Python的弱点是性能和速度,所以,他们在需要速度和性能的地方使用了C/C++。使用的 Python的版本是2.6。
使用Python的另一个原因是Python的数据结构和JSON可以很好的映射起来。代码易读性很高。而且有很多的库,调试器和重载器。Quora的B/S结构几乎完全通过JSON进行数据交互。
他们没有使用IDE,他们使用得最多的是Emacs,一看就知道这是一个个人的选择,随着他们开发团队的扩大,这个事会得到改变的。
另外,他们提到了PyPy,一个让 Python更快更灵活的项目。
Thrift
Thrift 用于后端服务器间的通讯。Thrift 服务由 C++开发。Facebook同样使用了这个技术。
参考:Why would you write a Thrift service in C++?
Tornado
Tornado Web 框架用于实时更新,其运行在Comet服务器上,其用来处理大量的需要长时间poll和push更新的网络连接。
Long Polling (Comet)
Quora的网页并不是简单的显示,每一个页面都需要更新,或是创建问题,答案和评论。所以,他们使用了Long Polling而不是传统的Polling,传统的Polling需要浏览器一端不停地重复地向服务器询问——“有更新吗?”,服务器说没有,于是过一会 浏览器再问,现在呢?服务器说,还是没有,浏览器过一会又问,现在呢?服务器说,还没好。这样一来,就好像让我们的客户端放到了驾驶室里,这显然是有问题 的,因为只有服务器知道什么时候会有更新。而且浏览器这么干,很快会让服务器的负载加上去。
Long polling 也就是我们熟知的 Comet, 其让服务器来控制这些事,让客服端等在那里听服务器的响应。在client和server的会话对于两者是是相同的,而不是client需要等着然后向服 务器查询。服务器端可以把一个连接打开很长时间(比如:60秒),在这段时间里,服务器会查看是否有相应的东西需要更新,如果有的话,就发给浏览器。如果 没有的话,就等下一次的client询问。可见,这种服务器等一会再响应的方法可以让浏览器少发几次查询。
对于long-polling 的最好的地方是,可以降低浏览器和客户端间来来回回的次数。让服务器端来控制时间,所以,内容更新可能会只是几个毫秒,或是几十秒。服务器端也可以积攒一堆更新后,一次发给浏览器。这样做会更有效率。
但是,这个方法的黑暗面是——这会让服务器端出现大量的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-less data,并说你不应该在你的社区还没有100万用户的时候使用NoSQL 数据库。
并不只是Quora和FriendFeed使用MySQL;Google, Twitter, Facebook都在使用MySQL.
Memcached
Memcached 用于 MySQL的前端缓存。
Git
JavaScript Placement
如果你看一下Quora的网页源码,你会看到其JavaScript总是在页面的最后。 Charlie Cheever建议这会让你的页面显得载入得很快,因为其先显示内容,然后在载入Javascript。
Charlie Cheever 遵从“14 Rules for Faster-Loading Web Sites”
Steve Souders, High Performance Web Sites 和 Even Faster Web Sites的作者,其列了一些rules让你网页更快的原则。 Charlie Cheever 的 Quora 创始人提到这些过,这应该也是Quora的速度的原因。[INDENT] “One resource we used as a guide is Steve Souders’ list of rules for high performance websites:http://stevesouders.com/hpws/rules.php” – Charlie Cheever, Quora
Steve Souders的14条规则是——
- Make Fewer HTTP Requests
- Use a Content Delivery Network
- Add an Expires Header
- Gzip Components
- Put Stylesheets at the Top
- Put Scripts at the Bottom
- Avoid CSS Expressions
- Make JavaScript and CSS External
- Reduce DNS Lookups
- Minify JavaScript
- Avoid Redirects
- Remove Duplicate Scripts
- Configure ETags
- Make AJAX Cacheable
Quora使用到的技术的更多相关文章
- Quora 用了哪些技术(转)
原文:http://dbanotes.net/arch/quora_tech.html 很多团队都在学习.研究 Quora .前段时间看到这篇 Quora’s Technology Examined ...
- Quora的技术探索(转)
原文:http://www.cnblogs.com/xiekeli/archive/2012/04/27/2473808.html 关于问答类的应用,最早接触的是stackoverflow和知乎 ,而 ...
- Quora的技术探索
关于问答类的应用,最早接触的是stackoverflow和知乎 ,而Quora作为知乎的原型,因为其创始人来自FaceBook而吸引了我.事实上关于Quora的技术分析,冯大辉和陈皓都已经有所详细的阐 ...
- CI Weekly #7 | Instgram/Quora 等大公司如何做持续部署?
终于,你们期待的 flow.ci iOS 项目持续集成 开始公测了.在这几个工作日, flow.ci 做了些许「功能优化」与「问题修复」,性能和体验都在持续优化中.比如: iOS 快速入门文档更新: ...
- 【转载】如何自学深度学习技术,大神Yann LeCun亲授建议
编者按:Quora 上有网友提问:自学机器学习技术,你有哪些建议?(What are your recommendations for self-studying machine learning), ...
- (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?
Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 建站有很多技术,如 HTML.HTML5.XHT ...
- 【JavsScript】JavaScript MVC 框架技术选型
你很喜欢Gmail和Trello之类的单页面应用,但是不太确定该从何开始.也许你的JavaScript代码是如此的杂乱无章,以致于你很想在下一个项目上尝试下JavaScript MVC库和框架,却苦于 ...
- NS实现采用的技术大多是PHP,如果采用java、 .net是否同样适用?
SNS采用的技术可不都是PHP (不局限于国内),特别是国外的新兴公司,基本上没有再用PHP的了,国内到还是蛮常用的.简单说说我知道的几个案例:Facebook (PHP):Facebook采用PHP ...
- 综合第一篇文章(带钩Quora)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDc4MzAyNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
随机推荐
- redis使用中的常见错误
1.2016年12月17日 启动redis报错,错误信息如下: 解决办法:redis没有正常关闭(redis安装在虚拟机上,直接杀死了虚拟机进程) 导致redis.pid文件一直被锁定,重启redi ...
- mysql使用default来设置字段的默认值
mysql创建表时,我们可以使用default来设置表字段的默认值,这样当向表中插入或添加数据时,如果没有为此字段设置任何值,则使用default默认值来填充该字段的值 在使用create table ...
- [xsy1140]求值
$\newcommand{ali}[1]{\begin{align*}#1\end{align*}}$题意:给定$n,b,c,d,e,a_{0\cdots n-1}$,令$x_k=bc^{4k}+dc ...
- (转)unity web 缓存解决方案
unity web 缓存解决方案 官方发布 web版限制五十M缓存,根据自己的经验绕了过去,解决了缓存的问题.带工程,带源代码.由于本人的水平也有限,是用JS来解决的,如果你还是没有头绪,可以购买来试 ...
- Asp.Net MVC part6 WebAPI
两种web服务SOAP风格:基于方法,产品是WebServiceREST风格:基于资源,产品是WebAPI可以返回json.xml类型的数据对于数据的增.删.改.查,提供相对的资源操作,按照请求的类型 ...
- Maven多模块项目新建技巧-解决公共项目install之后可以在单独模块中直接编译
说明:如果按照这种方式http://www.cnblogs.com/EasonJim/p/8303878.html,且按照常规的install方式在子项目中编译项目,那么需要先install一下par ...
- t-sql 笔记(2)
1.用标点符号分隔的字符串,转换成表 -- SELECT * FROM dbo.split('581:579:519:279:406:361:560',':') ), )) )) AS BEGIN D ...
- 规约模式Specification Pattern
什么是规约模式 规约模式允许我们将一小块领域知识封装到一个单元中,即规约,然后可以在code base中对其进行复用. 它可以用来解决在查询中泛滥着GetBySomething方法的问题,以及对查询条 ...
- Nice Messager隐私权政策
重视用户的隐私.您在使用我们的服务时,我们可能会收集和使用您的相关信息.我们希望通过本<隐私政策>向您说明,在使用我们的服务时,我们如何收集.使用.储存和分享这些信息,以及我们为您提供的访 ...
- 简述es6各种简单方法
1.取代var的let和const 局部变量都可以使用let 固定变量都可以使用const 2.字符串的变化 反引号的使用 3.解构赋值 let [a, b, c] = [1, 2, 3]; let ...