社交网络背后的技术力量

连续近一个星期以来一直在看关于做网页的相关东西,晚上突发奇想,何不去看看别人的网站如何写的?

打开人人网,就先从他入手了。发现地址栏中的网址为*****.do****的形式,便随口在网上问了一句:“人人网是用什么语言写的?”却没想到这个话题引起来不少人的兴趣,各位同学,学长甚至老师都参与了进来。

首先的问题是:.do是什么语言写出来的。

一般情况下.do语言是java写出来的,如果程序员没有刻意改动文件后缀的话,其实各种语言写出来的页面通过定义语言文件后缀都可以形成.do的后缀的,另外在java编程中struts常见.do文件后缀。

不过至于校内是什么语言写的,还是在千橡互动工作的肖学长最有发言权,证实是用java语言写成。另外在人人网的招聘岗位列表中我们也可以看到,没有提及java和c之外的语言的岗位,从侧面证实了这个结论。至于更绝的办法是,等待人人网报错的时候看看错误代码就知道什么语言了:)。

自然联想到facebook,印象中他可是使用的php写成的,但是他重写了php runtime为了对比java跟php,特别从网上查了一部分资料,其实目前大多数编程语言按是否生成目标文件(指令+数据)分为编译型和解释型的。又以其能否在运行时确定类型、改变其结构、引入新对象等分为动态语言和静态语言。一般来说动态语言基本上都属于解释型。而脚本语言一般是动态语言。

动态语言相对于静态语言来说,不必强制声明变量类型,不必严格的按照某些缚手缚脚的规定来开发。大大加快了开发的速度,提供良好的开发体验。相对于静态语言,实现相同的功能动态语言的代码量明显减少。照理说,动态语言应该全面超过静态语言取而代之。但是,事实上,宽松的环境是牺牲性能来完成的。所以,在对性能要求很高的情况下,动态语言往往都不能入选。静态语言虽然严谨得古板,但以编译成目标代码而实现高效。

作为全球最大的社交网络Facebook来说数据处理中,速度和效率还是非常重要的,那么如果java跟没有经过优化的php相比快很多的,可以从淘宝网在光棍节那天交易量大到网银基本阻塞的情况下支付宝仍然较为稳定看出来他们之前从php迁移到java平台上效率提升还是很大的,虽然,对于个人来说,一个复杂运算跑10ms还是100ms无所谓,但是对于每月有4000亿PV的FaceBook来说,效率提升就相当于几千万的设备投入。因此Faceook重写了PHP Runtime。

传说上周Facebook开发团队邀请了核心PHP团队到公司讨论他们的新开源项目,这些核心的PHP开发者还被迫签署了保密协议。但有匿名人士留言说,Facebook是在开发一个PHP编译器,Facebook版本的PHP将从一个动态语言变成了一个预编译类型安全语言。这将能使PHP的速度提升10倍。

而这个新的PHP runtime已经可以从GitHub上看到,他叫 HipHop 他的本质上就是把一些重要的部分做成了已编译后的可执行代码,大量减少每次都翻译造成的资源浪费。其实FaceBook还有相当多的改进。


Hadoop and Hive

Hadoop的是一个开源的map-reduce实现,使得它可以在进行大数据上进行运算。 Facebook的使用这个进行数据分析(而我们都知道,Facebook已经大量的数据)。 Hive就是发源于Facebook,使得对于Hadoop使用的SQL查询成为可能,从而是其更容易对非程序员使用。Hadoop和Hive是开源的(Apache项目),有为数众多的追随者,例如雅虎和Twitter。
Thrift

Facebook使用的几种不同的语言和不同的services。 PHP是最终用于前端,Erlang是用于聊天,Java和C ++也使用于多种场所,也许还有其他语言。Thrift是一个内部开发的跨语言的框架,联系语言,使他们可以在一起合作,从而使他们之间可以交互。 这使得Facebook可以更容易为继续保持其跨语言的发展。

Facebook已经让Thrift开源。更多的语言支持已被添加到Thrift。

Varnish

Varnish是一个HTTP加速器,可以作为一个负载平衡器,并缓存的内容,然后可以以闪电般的速度送达。

Facebook使用的arnish来处理照片和个人资料图片,处理每天数十亿的要求。 和其他的东西一样,Varnish是开源的。

保持Facebook 顺畅运行的其他东西

我们已经提到的软件,组成了Facebook的系统,并帮助运行在大规模上。 但是,处理这么大的系统是一个复杂的任务,因此我们将列出一些其他的东西,他们保持了Facebook的平稳运行。

渐进发布和暗启动

Facebook有一个他们所谓的守门人制度(Gatekeeper),允许他们可以给不同的用户运行两套不同的系统。 这让Facebook渐进的发布新的功能,A / B测试,只为Facebook雇员发布等的某些特性。

Gatekeeper也可以让Facebook实现“暗启动”,这是在用户使用一些功能之前,就激活某些功能(因为用户没有察觉,所以称之为暗启动)。 这将作为一个现实世界的压力测试,在正式启动前,帮助揭露一些功能障碍和其他问题。 暗启动通常是在正式启动前两个星期。

Profiling的直播系统

Facebook的仔细监控其系统,有趣的是它也负责监察每一个PHP函数在生产环境的性能。 检测各个PHP的环境的配置运行情况。使用开源工具,XHProf 。

渐进的利用关闭功能来提升性能

如果Facebook运行时出现性能问题,有一个办法,就是逐步禁用不太重要的功能,以增强Facebook的大量核心功能表现。

没有提到硬件相关的事情,但这也是提高可伸缩性的重要一环。例如,就像其他大型站点,Facebook利用CDN来处理静态内容。Facebook还有一个the huge data center,可以帮助他扩展更多的服务。

Facebook亦开源了Tornado,一个高性能的网络服务器框架,由FriendFeed团队开发。关于开放源码软件清单,可以在Facebook’s Open Source page.找到。

Facebook扩展所依赖的软件

Facebook是在某些程度上说仍然是LAMP的站点,但它比普通的LAMP大得多,以纳入其他元素和很多服务,并修改现行的做法。

◆Facebook仍使用PHP,但它已经为它建立一个编译器,以便它可以分为本地代码打开了Web服务器,从而提高性能。

◆Facebook使用Linux,但他特别为网络吞吐量做了优化。

◆Facebook使用MySQL,但主要是作为一个Key-value的持久性存储,Jions和服务器逻辑操作在Web服务器上操作。因为在那里更容易执行。

还有是自编写的系统,如Haystack,一个高度可扩展的对象存储,用来存储Facebook的照片。还有Scribe,一个日志系统,可以运行在Facebook的巨大规模上的日志系统。

现在介绍一下全球最大的社会网络网站的所使用的软件吧。

Memcached

memcached的是现在互联网最有名的软件之一了。 这是一个分布式内存缓存系统,用来作为Web服务器和MySQL服务器之间的缓存层(因为数据库访问比较慢)。 多年以来,Facebook已经提出了一些优化Memcached和一些周边软件的办法。如压缩network stack。Facebook的每时每刻都有数10TB的数据缓存在Memcached的数千台服务器上。 它可能是世界上最大的Memcached的集群了。

HipHop for PHP

PHP作为一种脚本语言,和本地程序相比是运行缓慢的。 HipHop可以将PHP转换成C + +代码,然后再进行编译,可以获得更好的性能。 因为Facebook严重依赖PHP,这使得其可以让Web服务器运行的更有效率。一个工程师小团队在Facebook(一开始只有三人)花了18个月时间开发HipHop,现在已经是可用状态。

Haystack

Haystack是Facebook的高性能照片存储/检索系统(严格来说,是一个对象存储,因此它并不一定要存储照片)。 它有许多工作要做;有超过20亿张上传的照片,并且每一个被保存在四个不同的分辨率,因此有超过800亿张照片。

它不仅是对能够处理的上亿的照片,运行表现也是至关重要的。 正如我们前面提到的,Facebook的服务约120万张照片每秒 ,这个数字不包括CDN上的。 这是一个惊人的数字。

BigPipe

BigPipe是Facebook开发的一个动态的网页服务系统。 Facebook使用它来按section(称为“pagelets”)处理每个网页,以获取最佳性能。例如,在聊天窗口是分开的,新闻Feed也是分开的,等等。 这些pagelets可以在一个页面表现的时候同时使用,这是该页面表现的时候获取进来的。即使某些工程的一部分关闭或中端,用户也可以获得一部分网页。

Cassandra

Cassandra是一个不会单点失败的分布式存储系统。 这是为NoSQL运动的一个重要组成部分,并已公开的源代码(它甚至成为一个Apache项目)。Facebook在搜索功能中使用它。

Scribe

Scribe是一个灵活的日志系统,Facebook在他的内部大量使用。 它的能够处理在Facebook的大规模日志记录,并自动处理新的日志记录类别,Facebook有数百个日志类别(categories)。

当然,话说回来,java其实在企业级中应用还是相当强大的,比如IBM的几乎全套产品线豆搬到了java上,具有相当好的跨平台效果,另外想率也是相当高的,另外,这两天在用的Matlab又是另一个java在科学计算领域里面的例子了,谁说java不如人?国内有个趋势:大型应用以及集群运算逐渐向java平台靠拢,百付宝,财付通,都在招聘java高手,支付宝已经完成了向java转移的工作,下一步mop也要做开放平台,逐步在向java靠拢中……

4 Comments

liang says:

Social Network很不错的电影,我也很喜欢~

* 笑得海潮 says:

的确不错的电影,还反映出了创业者的艰辛

ZHANTAO says:

有幸拜读您的文章,能给个联系方式吗?希望能向您请教一些相关的问题,谢谢!

* 笑得海潮 says:

zzhhgo@gmail.com 抱歉很晚才看到。。

Leave a Reply

Your email address will not be published.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax