为什么在Web Server基础架构中使用后端服务器和RPC?

问题描述:

我有兴趣创建一个web应用程序,我刚刚做了一些关于什么使得一个好的web服务器的研究。我已经通过facebook,twitter和foursquare进行搜索。他们分享他们用来构建基础设施的软件。为什么在Web Server基础架构中使用后端服务器和RPC?

对我而言,一些使用的软件是新的。我想在这里问一些问题。 为什么要创建一个后台服务器,是不是运行PHP的web服务器就够了?为什么使用java/scala作为后端?我们是否真的需要诸如thrift/protocol buffer之类的RPC框架?什么是RPC框架使用?它用于前端和后端服务器之间的通信吗?

非常感谢那些回答我的问题,或者如果有一些书你会建议我阅读。

谢谢。

+1

当涉及到软件时,这是一个很好的经验法则 - 只使用你需要的东西,而不是更多的东西。 – Perception 2012-04-12 13:03:22

例如,我遇到很多使用PHP开发复杂webapp的问题。 PHP没有任何线程,php缺乏很多有scala的好东西,或者是带有丰富语法的另一种好的现代语言。与编译的JVM语言相比,PHP速度较慢。我认为PHP不太安全。获得大量数据并呈现为HTML页面是一件好事,但高负载处理不是它的优点。您建议的RPC作为通信层。

这听起来好像你想建立一个最终将被用来做以下可扩展的后端基础设施:

  1. 提供内容。这是Web服务器层。
  2. 对来自Web服务器层的用户请求 执行某种类型的后端处理,并与数据存储进行通信。将其称为应用程序服务器层。
  3. 将会话状态和用户数据保存在分布式,容错,最终一致的密钥值存储中。

此外,它听起来好像你想使用商用PC硬件做到这一点。

这是一个很高的订单。

Foursquare使用Scala和Lift框架,jetty为他们的web服务器。这里是more。和more

Facebook使用许多不同的技术。我知道他们使用HBase的数据存储(他们使用Cassandra)

雅虎使用HBase跟踪用户统计信息。

Twitter作为Ruby后端网站开始。他们搬到了斯卡拉。 Twitter正在使用他们专有的增量数据库转换工具逐步从mysql(我假设分片)转移到Cassandra。对于应用程序服务器和Web服务器端的扩展,我知道真正重要的是拥有能够在用户空间中产生新用户进程的能力以及为新的工作进程分配请求的管理器进程进来。把它想象成一个非常有效率的公司。你进来的工作越多,你雇用的人越多。这是Actor model.一些语言有内置演员,(erlang)其他人有演员作为框架(akka)或图书馆(Scala本机)实现。显然,斯卡拉的本地演员是越野车,所以有些人聚在一起并实施Scala和Java的akka​​框架。网上有很多关于演员的讨论,以及应该使用哪种语言和图书馆。 Erlang有很多开箱即用的功能,但是,Scala运行在JVM中,允许您重用很多现有的Java Web库(如果它们碰巧在其中声明了静态对象,那么可能会出现一些问题)Erlang有演员和OTP库,但显然没有Java拥有的丰富库。所以,对我来说,它真的归结为斯卡拉(与akka)或Erlang。

对于使用Scala的Web服务器,您可以使用任何Java应用程序服务器。 Foursquare使用码头为大多数事情。它不是用Scala编写的,但是由于Scala编译成在JVM上运行的字节码,所以它很容易与任何Java应用程序服务器进行交互。
人们也说,有没有那么多的Erlang程序员和Erlang是更难学(functional programming VS imperative programming)Scala是在同一时间的功能和必要的(这意味着你可以做任何)

Erlang是功能性的。现在,函数式编程有很多事情要做,因为一个专家函数式编程人员可以比专家式编程人员做得更多。另一方面,强制性编程更容易学习,并在团队设置中广泛使用。命令式语言对于某些东西很有用,对于其他的功能语言也是如此。 其他。 The right tool for the right job.

回到Web服务器的讨论,与二郎神,你可以使用雅司病也可以运行一个框架(芝加哥老板)

Here's更多斯卡拉VS二郎辩论。另外link
更多here
another。另外。

在数据库端,您有很多选择。见here. 你甚至可以避开数据库全在一起,在Mnesia中保存数据(Erlang的运行数据存储)

我的答案是不完整的,因为这话题(缩放应用服务器,数据库和Web服务器)是非常复杂的,充满了辩论。有些框架甚至模糊了层(Web服务器,应用程序服务器,数据库)的区别,并在框架本身内集成了这些层的许多功能。