我会尝试回答你的(大)问题,但不是从Facebook的角度来看,因为他们的架构是众所周知的。
首先你必须知道的是,你将不得不分发你的web应用程序的工作量。问题在于如何,所以为了确定什么会很慢,你必须分段划分你的应用程序。
首先是HTTP服务器,或接受所有请求的服务器。通过访问“www.your-facebook.com”,您可以联系IP上的服务。当然,你可能会有多个IP,但我们假设你有一个入口点。
现在会发生什么?你有一个HTTP服务器软件,比方说Apache和它处理传入的连接。由于Apache为每个连接的用户创建一个线程,因此它需要一定量的内存用于该操作。最终,它将耗尽内存,然后狗屎击中风扇,东西停止工作,您的网站不可用。 因此,你必须以某种方式扩展你的应用程序的这一部分,它将你的PHP代码/ MySQL数据库连接到想要与之交互的人。
让我们假设你成功地扩展了你的Apache,并且你有一个可以接受新计算机以扩展的计算机集群。你解决了你的第一个问题。
下一部分是做这项工作的实际层。接受来自用户的输入并将其保存在某处(MySQL),这是您将遇到的最大问题 - 为什么? 由于数据库。
数据库将数据存储在介质(如硬盘驱动器)上。硬盘,无论是SSD还是机械硬盘,都受限于其写入或检索数据的能力。如果我没有弄错,RAM的传输速率大约为6GB /秒。更不用说寻找时间也远远低于HDD的寻找时间。因此,如果您有X个用户要求提供一条信息,并且您只能以特定的速度提供它 - 您的应用程序崩溃,或者它变得没有响应,并且处理数据库查询的层变得很慢,因为硬件无法匹配您需要数据的速度。
这里有什么选择?有很多,我不会提及他们所有人
拆分读取和写入。设置你的数据库层,使得你有专门的机器来写数据,而完全不同的机器读数据。你必须使用复制和复制有它自己的怪癖 - 它永远不会破坏。
通过分解数据来优化数据集的处理。非常适合读/写性能,当您需要查询多个分片并合并数据时会搞砸了。
获取更好的硬件,特别是存储(如FusionIO)
收费更好的存储引擎(如TokuDB)
通过使用缓存减轻数据库的负载。您的用户请求的数据可能不会经常更改,因此您必须每次查询数据库(例如,您正在查看某人的个人资料,他们每秒钟会更改它的机会有多大?)。这就是为什么Facebook广泛使用Memcached的原因 - 一种将小块数据存储在RAM中的系统,它可以轻松扩展,而不是什么。最重要的是,它该死的快!
在MySQL旁边使用不同的解决方案。 MySQL(以及其他一些数据库)不适合每种数据存储或检索。有人提到过NoSQL。 NoSQL解决方案很快,但仍然不成熟。它们不如关系数据库那么多。他们使用延迟磁盘写入的方法(它们保存需要在RAM中写入的数据的缓存副本),以便它们可以实现快速插入速率。这就是为什么在使用NoSQL时丢失数据并不罕见。
主题有关MySQL与“插入数据库或任何这里”是广泛的,我不想去成,但要记住 - 数据存储的每一个在那里最终在硬盘上保存数据。不同的(当然是物理)是他们如何优化自己对磁盘的冲洗。
我也没有提到你可以通过收集数据运行的各种报告(有多少19至21岁的男人在01:15和13:37 CET之间点击了广告X等),这是Facebook实际上是什么收集(可怕的东西!)。
第三种 - 粘合数据存储(MySQL)和输出(HTTP服务器)的语言。 PHP。
正如您所看到的,这里的大部分工作已经由Apache和MySQL完成。 PHP级别的优化很小,即使Facebook得到的结果很小(他们声称有50%,但是高达50%)。我广泛试用HipHop,但速度并不像它声称的那么快。当然,Facebook的人已经提到过,所以这也就不足为奇了。他们获得的好处是因为他们用自己的内置HipHop的服务器取代了Apache。有人声称“语言X比语言Y好”,他们是对的,但情况并非总是如此。每种语言都有其优点和缺点。例如,PHP广泛传播,但对于某些操作(例如,实施具有超过10亿条目的Trie)的缓慢。在分析db输出后回显一些HTML是非常棒的。从数据库插入和检索数据很快,大约占用PHP的90% - 与db交谈,显示数据,结束。
因此,无论您使用何种语言(比如我们使用C++而不是PHP),您的瓶颈将是数据存储/检索层。
另一方面,为什么使用C++不方便?因为知道如何使用PHP的人比使用C++的人多。在C++中开发Web应用的速度也慢得多。当然,他们会更快地执行,但谁会注意到1毫秒和1微秒之间的差异?
这篇文章更像是一篇翔实的博客文章,我知道它没有充足的资源来备份我的声明,但任何使用大型数据集或网站做任何工作的人都会知道P.I.T.A.始终是数据存储组件。我说过的一些东西可能不适合所有人,但在NUTSHELL中,这是您如何优化网站的方式。
最终你会意识到MySQL是一条狗,并开始寻找不同于NoSQL数据库的东西。与此同时,您将开始寻找另一种更高效的编程语言。 –
看起来Facebook仍然使用PHP作为其主要编程语言,因此必须足够高效。 –
虽然他们使用他们自己的HipHip库将它(某些?)转换为C++。 – TJHeuvel