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



阅读两本书后,编程Erlang(Joe Armstrong(编程Elixir(Dave Thomas(,我有一些问题现实世界中的Erlang/Elixir。

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如此成熟,以至于可以处理所有后端工作吗?

如果是真的,此Erlang/Elixir代码基库是否会单片?

Q2:软实时

源自使用Erlang/OTP(Francesco cesarini& Steve Vinoski(设计可伸缩性:

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

Erlang/Elixir真的可以做到吗?

如果我的Erlang服务器(仅在机器上(只能处理1M消息/秒,并且请求SPIKE为5M请求/秒,几乎所有请求都将在5秒内处理吗?没有分布式环境,Erlang如何工作?为什么其他后端技术不能这样做(例如node.js(?

Q3:实时可伸缩性

是否有任何可用的技术/工具/图书馆/服务或实际情况可以通过在检测请求Spikes时自动添加ERLANG节点来扩展,并在使用掉落后立即进行扩展?

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

Q4:优化

我知道 WhatsApp 使用Erlang支持他们的服务。他们在Erlang上进行了很多优化。有任何信息吗?如果我们需要优化我们的Erlang服务,我们该如何启动?

回答Q2。

elixir和erlang可以处理尖峰,因为他们的Web服务器通常为每个请求产生一个新的Erlang进程。这是可以实现的,因为Erlang过程比OS过程和线程轻得多。许多其他语言使用OS线程进行并发,并使用民意调查来管理主机机器上的有限资源。

最适中的服务器可以处理超过一百万个同时的流程。由于每个请求都是一个流程,因此在提供所需的CPU资源以完成请求时,每个请求都完成。

过程调度是Erlang是合作的,而不是先发制的,允许上下文切换的发生速度比OS中的转换快得多。最后,Elixir和Erlang默认使用CPU上的所有内核。

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

Erlang VM是电信系统的设计,以支持许多手机的并发。与今天相比,在记忆和CPU非常有限的早期时,它也是设计。

回答Q1

tl; dr yes,长生不老药已经足够成熟

长生不老药建立在非常成熟的Erlang VM上。它是电信开关的基础,必须支持九种可靠性。由于长生不老药在Erlang VM上运行,因此如果缺少特定功能或elixir依赖性,则可以直接从Elixir中使用Erlang。同样,您可以在Elixir项目中混合和匹配Elixir和Erlang软件包。使用Erlang项目时也是如此。

以下几点应解决您的表格。

  • Elixir Web应用程序在NGINX或APACHE REVERSE代理
  • 之后工作得很好
  • 长生不老药使编写并发代码非常容易,使其适用于长期运行的请求,使用负载平衡器将请求指向服务器A或B
  • 长生不老药支持Redis,Mongo和许多其他后端。我亲自在一个用Rails和Elexir的Phoenix Framework中部分编写的应用程序之间共享了相同的数据库表。我什至分享了两个之间的会话数据。
  • 长生不老药可以写在用于编译(.ex扩展(以及脚本(.exs(的文件中,这使其适用于脚本。Elixir的并发模型使得无需使用外部命令行CRON就可以轻松地编程计划的作业。最后,长生不老药在库中有许多构建,用于文件管理和操作系统特定功能。

Elixir应用程序,无论是Web应用程序还是纯净的后端应用程序,都可以很容易地构建状态。它内置在回声系统中,不需要任何第三方API。此外,这是一个凤凰网络应用程序,它首先是一款具有其他组件的状态精灵应用程序,可以帮助开发Web应用程序。因此,您将获得进行定期安排之类的事情。

要清楚,当我说陈述时,我的意思是您可以设计自己的应用程序来管理状态。长生不老药中的变量是不变的。需要通过为并发设计的非常控制的抽象来管理状态。例如,您可以选择使用Genserver管理一些中心状态。访问/最新状态的唯一方法是将不变的消息传递给Genserver。并且由于接收到特定过程的消息已序列化,因此数据访问是并发安全的。

最新更新