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 ...
随机推荐
- python排序sorted与sort比较
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. sorted(iterable,key=None,revers ...
- Java中的标记接口(zz)
1.什么是标记接口? Java中把没有定义任何方法和常量的接口称之为标记接口,我们经常使用的比较多的是“”Serializable“”,这个接口也是没有定义人任何方法和常量的. 2.标记接口的作用? ...
- 跳转的两种实现方法setInterval和setTimeout
setInterval方法: <html> <head> <meta http-equiv="Content-Type" content=" ...
- magento 调整产品详细页自定义选项或配置项的位置
默认位置如下图,感觉不美观 调整后,如下图 打开后台产品页,找到Design下的Display product options in属性,可以看到两个选项:Product Info Column和Bl ...
- 【转】进程、线程、 GIL全局解释器锁知识点整理
转自:https://www.cnblogs.com/alex3714/articles/5230609.html 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线 ...
- 差分数组 and 树上差分
差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...
- hihocoder Popular Products(STL)
Popular Products 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N lists of customer purchase, your tas ...
- 8、Django实战第8天:session和cookie自动登录机制
因为http是无状态协议,因此,并不会记录用户的登录状态.在早期,是直接把用户名和密码等信息存储在浏览器的cookie来实现记录用户密码登录. 但是这样存在安全隐患,只要别人登录你的电脑cookie信 ...
- wildfly8.1部署注意事项
wildfly8.1部署注意事项 jboss 最近新项目上线,本人部署过程中总结了以下几点比较关键的地方,看是否对大家有用处 服务器改成支持外网访问 在standalone.xml文件中找到 ...
- [CF480E]Parking Lot
题意:给一个$n\times m$的网格,初始时有些地方不能选,给$k$个询问$(x,y)$,每次令$(x,y)$不能选,然后询问最大子正方形的边长 如果按原题来做,禁止选一个点对答案的影响是极其鬼畜 ...