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

Posted

技术标签:

【中文标题】为啥在 Web Server 基础架构中使用后端服务器和 RPC?【英文标题】:Why use backend server and RPC in Web Server infrastructure?为什么在 Web Server 基础架构中使用后端服务器和 RPC? 【发布时间】:2012-01-30 16:58:56 【问题描述】:

我对创建一个 Web 应用程序很感兴趣,并且我刚刚对如何打造一个好的 Web 服务器进行了一些研究。我搜索过 facebook、twitter 和foursquare。他们分享了他们用来构建基础设施的软件。

对我来说,使用的一些软件是新的。我想在这里问一些问题。 为什么要创建后端服务器,运行php的Web服务器还不够吗?为什么使用 java/scala 作为后端?我们真的需要 RPC 框架,例如 thrift/protocol buffer 吗?那个 RPC 框架是用来做什么的?它用于前端和后端服务器之间的通信吗?

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

谢谢。

【问题讨论】:

在软件方面有一个很好的经验法则 - 只使用你需要的东西,而不是更多。 【参考方案1】:

听起来好像您想构建一个可扩展的后端基础架构,最终将用于执行以下操作:

    提供内容。这是网络服务器层。 对用户请求执行某种类型的后端处理 从 Web 服务器层进入并与数据存储进行通信。将此称为应用程序服务器层。 将会话状态和用户数据保存在分布式、容错、最终一致的键值存储中。

此外,听起来您似乎想使用商用 PC 硬件来执行此操作。

这是一项艰巨的任务。

Foursquare 使用 Scala 和 Lift 框架,jetty 用于他们的 Web 服务器。这是more。还有more。

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

Yahoo 使用 HBase 来跟踪用户统计信息。

Twitter 最初是一个 Ruby 后端网站。他们搬到了斯卡拉。 Twitter 正在使用他们专有的增量数据库转换工具从 mysql(我假设是分片的)逐步迁移到 Cassandra。

就应用程序服务器和 Web 服务器端的扩展而言,我知道真正重要的是拥有一种能够在用户空间中产生新用户进程的语言和一个分配新工作进程的管理器进程来处理即将到来的请求把它想象成经营一家非常有效率的公司。你进来的工作越多,你雇佣的人就越多。这是Actor model. 一些语言有内置的actor,(erlang) 其他的有作为框架(akka) 或库(Scala native) 实现的actor。显然,Scala 的原生 actor 有问题,所以一些人聚在一起为 Scala 和 Java 实现了 akka 框架。网上有很多关于演员以及应该使用哪种语言和库的讨论。 Erlang 有很多开箱即用的功能,但是,Scala 在 JVM 中运行,并允许您重用许多现有的 Java Web 库(如果它们碰巧在其中声明了静态对象,可能会出现一些问题) Erlang有演员和 OTP 库,但显然没有 Java 拥有的丰富库。所以,对我来说,它真的归结为 Scala(使用 akka)或 Erlang。

对于 Web 服务器,借助 Scala,您可以使用任何 Java 应用服务器。 Foursquare 在大多数事情上都使用码头。它不是用 Scala 编写的,但由于 Scala 可以编译为在 JVM 上运行的字节码,因此它可以轻松地与任何 Java 应用程序服务器进行互操作。 人们还说,Erlang 程序员并不多,而且 Erlang 更难学习(functional programming vs imperative programming)Scala 是函数式和命令式的(这意味着你可以两者都做)

Erlang 是函数式的。现在,函数式编程有很多事情要做,因为一个专业的函数式程序员可以比一个专业的命令式程序员做更多的事情。 Yahoo stores was originally written and maintained in Lisp (functional language) by one man. 另一方面,命令式编程更容易学习并在团队环境中广泛使用。命令式语言适用于某些事情,函数式语言适用于某些事情 其他。 The right tool for the right job.

回到 web 服务器的讨论,用 Erlang,你可以使用 yaws 也可以运行一个框架(Chicago Boss)

Here's 更多关于 Scala 与 Erlang 的辩论。 另一个link。 更多 here. 还有another. 另一个opinion。

在数据库端,您有很多选择。见here. 您甚至可以完全避开数据库并将数据保存在 mnesia(Erlang 的运行时数据存储)中

我的回答并不完整,因为这个主题(扩展应用服务器、数据库和 Web 服务器)非常复杂且充满争议。一些框架甚至模糊了层(Web 服务器、应用程序服务器、数据库)的区别,并将这些层的许多功能集成到框架本身中。

【讨论】:

【参考方案2】:

例如,我在仅使用 PHP 开发复杂的 webapp 时遇到了很多问题。 PHP 没有线程,php 缺少许多具有 scala 或另一种具有丰富语法的优秀现代语言的好东西。与已编译的 JVM 语言相比,PHP 速度较慢。在我看来,PHP 的安全性较低。获得一堆数据并呈现为 html 页面是很好的,但处理高负载并不是它的优点。您建议的 RPC 用作通信层。

【讨论】:

以上是关于为啥在 Web Server 基础架构中使用后端服务器和 RPC?的主要内容,如果未能解决你的问题,请参考以下文章

互联网分层架构,为啥要前后端分离?

WEB 后端架构演进

[基础架构]PeopleSoft Web Server 重要文件说明

后端框架django

Keepalived基础

Zabbix 中继模式 Proxy