Erlang / Elixir如何在现实世界中工作

时间:2017-04-30 18:08:09

标签: erlang elixir

在阅读了两本书,编程Erlang(Joe Armstrong)编程Elixir(Dave Thomas)后,我对现实世界中的Erlang / Elixir有一些疑问。< / p>

Q1:统一后端开发

我在科技谈话中看到了一张桌子(我制作了截图,但我忘记了来源。如果你知道,请发表评论):

+ ---------------------- + ------------------------- + --------- +
| Technical requirement  | Server A                  | Server B  |
+ ---------------------- + ------------------------- + --------- +
| HTTP Server            | Nginx & Phusion           | Elixir    |
| Request Processing     | Ruby on Rails             | Elixir    |
| Long Running Requests  | Go                        | Elixir    |
| Server-Side State      | Redis                     | Elixir    |
| Persistable Data       | Redis & Mongo             | Elixir    |
| Background Jobs        | Cron, Bash Scripts & Ruby | Elixir    |
| Service Crash Recovery | Upstart                   | Elixir    |
+ ---------------------- + ------------------------- + --------- +

这是真的吗? Erlang / Elixir是如此成熟以至于它可以处理所有后端工作吗?

如果为true,这个Erlang / Elixir代码库是否会是单片的?

Q2:软实时

使用Erlang / OTP设计可扩展性(Francesco Cesarini和Steve Vinoski)

  

如果您的系统吞吐量是每秒一百万条消息,并且有一百万条同时发生的请求正在处理中,则需要1秒钟来处理并向其收件人发送请求。但是如果在峰值期间发送了200万个请求,则吞吐量不会降低;不是一些,但所有请求都应在2秒内处理。

Erlang / Elixir真的能做到吗?

如果我的Erlang服务器(仅在机器上)只能处理1M条消息/秒并且请求峰值是5M请求/秒,几乎所有请求都会在5秒内处理完毕? Erlang如何在没有分布式环境的情况下工作?为什么其他后端技术无法做到这一点(例如node.js)?

Q3:实时可扩展性

是否有任何可用的技术/工具/库/服务或实际案例可以通过在检测到请求峰值时自动添加Erlang节点来扩展,并在使用率下降后立即缩小?

哪些工具适合管理Erlang / Elixir的部署/监控/操作?

Q4:优化

我知道 WhatsApp 使用Erlang来支持他们的服务。他们对Erlang进行了很多优化。有关这个的任何信息?如果我们需要优化我们的Erlang服务,我们该如何开始呢?

1 个答案:

答案 0 :(得分:17)

回答Q2。

Elixir和Erlang可以处理峰值,因为他们的Web服务器通常会为每个请求生成一个新的Erlang进程。这是可以实现的,因为Erlang进程比OS进程和线程轻得多。许多其他语言使用OS线程进行并发,并使用轮询来管理主机上的有限资源。

大多数非常适中的服务器可以处理超过一百万个并发进程。由于每个请求都是一个进程,因此在为所有请求提供所需的cpu资源以完成请求时,每个请求都已完成。

进程调度是Erlang是合作的,而不是抢占式的,允许上下文切换比OS中的更快。最后,Elixir和Erlang默认使用CPU上的所有内核。

只要服务器配置了足够的内存并且适当地设置了进程启动变量的数量,它就非常可行。

Erlang VM是为电信系统设计的,用于支持许多手机的并发性。它也是在早期设计的,与现在相比,内存和CPU非常有限。

回答Q1

TL; DR是的,Elixir足够成熟

Elixir构建于Erlang VM之上,非常成熟。它是必须支持Many Nines Reliability的电信交换机的基础。由于Elixir在Erlang VM上运行,如果特定功能缺少Elixir或Elixir依赖项,则可以直接从Elixir使用Erlang。同样,您可以在Elixir项目中混合使用Elixir和Erlang包。使用Erlang项目时也是如此。

以下几点应该适用于您的表格。

  • Elixir网络应用程序非常适用于Nginx或Apache反向代理
  • Elixir可以很容易地编写并发代码,使其适合长时间运行的请求,使用负载均衡器将请求定向到服务器A或B
  • Elixir支持Redis,Mongo和许多其他后端。我亲自在一个部分用Rails编写的应用程序和部分用Elixir的Phoenix Framework编写的应用程序之间共享相同的数据库表。我甚至在两者之间共享了会话数据。
  • Elixir可以用于编译(.ex扩展名)的文件以及脚本(.exs),这使得它适合脚本编写。 Elixir的并发模型使得编写预定作业变得非常容易,而无需使用外部命令行cron。最后,Elixir有许多用于文件管理和操作系统特定功能的库。

Elixir应用程序,无论是Web应用程序还是纯后端应用程序,都可以轻松构建有状态的应用程序。它内置于echo系统中,不需要任何第三方API。此外,凤凰网络应用程序,它首先是一个有状态的Elixir应用程序与一些额外的组件,以协助开发Web应用程序。因此,您可以执行定期安排等操作。

为了清楚起见,当我说有状态时,我的意思是你可以设计你的应用来管理状态。 Elixir和Erlang中的变量是不可变的。状态需要通过为并发而设计的非常受控的抽象来管理。例如,您可以选择使用GenServer管理某个中央状态。访问/缩小该状态的唯一方法是将不可变消息传递给GenServer。由于接收到特定进程的消息是序列化的,因此数据访问是并发安全的。