听起来好像您想构建一个可扩展的后端基础架构,最终将用于执行以下操作:
- 服务内容。这是网络服务器层。
- 对来自 Web 服务器层的用户请求执行某种类型的后端处理,并与数据存储进行通信。将此称为应用程序服务器层。
- 将会话状态和用户数据保存在分布式、容错、最终一致的键值存储中。
此外,听起来好像您想使用商品 PC 硬件来执行此操作。
这是一项艰巨的任务。
Foursquare 使用 Scala 和 Lift 框架,jetty 用于他们的 Web 服务器。这里还有更多。还有更多。
Facebook 使用许多不同的技术。我知道他们的数据存储使用 HBase(他们使用的是 Cassandra)
雅虎使用 HBase 来跟踪用户统计信息。
Twitter 最初是一个 Ruby 后端网站。他们搬到了斯卡拉。Twitter正在使用其专有的增量数据库转换工具逐步从 mysql(我假设是分片的)迁移到 Cassandra。
就应用程序服务器和 Web 服务器端的扩展而言,我知道真正重要的是拥有一种能够在用户空间中产生新用户进程的语言和一个能够为新的工作进程分配传入请求的管理器进程。想想将其视为经营一家非常高效的公司。你进来的工作越多,你雇佣的人就越多。这是 演员模型。一些语言内置了actor,(erlang)其他语言将actor实现为框架(akka)或库(Scala native)。显然,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 更难学习(函数式编程与命令式编程) Scala 同时是函数式和命令式的(这意味着你可以做任何一个)
Erlang 是函数式的。现在,函数式编程有很多事情要做,因为一个专业的函数式程序员可以比一个专业的命令式程序员做更多的事情。 雅虎商店最初是由一个人用 Lisp(函数式语言)编写和维护的。另一方面,命令式编程更容易学习并在团队环境中广泛使用。命令式语言适用于某些事物,而函数式语言则适用于其他事物。正确工作的正确工具。
回到 web server 的讨论,有了 Erlang,你可以使用 yaws 也可以运行一个框架(Chicago Boss)
这里有更多关于 Scala 与 Erlang 的争论。
另一个链接。
更多在这里。
还有一个。
另一种意见。
在数据库端,您有很多选择。见这里。
您甚至可以完全避开数据库并将数据保存在 mnesia(Erlang 的运行时数据存储)中
我的回答并不完整,因为这个主题(扩展应用服务器、数据库和 Web 服务器)非常复杂且充满争议。一些框架甚至模糊了层(Web 服务器、应用程序服务器、数据库)的区别,并将这些层的许多功能集成到框架本身中。