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

Erlang/Elixir在现实世界中是如何工作的,erlang,elixir,Erlang,Elixir,在读了两本书,编程Erlang(Joe Armstrong)和编程Elixir(Dave Thomas)之后,我对现实世界中的Erlang/Elixir有一些问题 问题1:统一后端开发 我在一次技术讲座中看到一张桌子(我做了一个截图,但我忘记了来源。如果你知道,请留下评论): 这是真的吗?Erlang/Elixir是否成熟到可以处理所有后端工作 如果为真,这个Erlang/Elixir代码库是否是单片的 问题2:软实时 通过Erlang/OTP设计可扩展性(Francesco Cesarini&

在读了两本书,编程Erlang(Joe Armstrong)和编程Elixir(Dave Thomas)之后,我对现实世界中的Erlang/Elixir有一些问题

问题1:统一后端开发 我在一次技术讲座中看到一张桌子(我做了一个截图,但我忘记了来源。如果你知道,请留下评论):

这是真的吗?Erlang/Elixir是否成熟到可以处理所有后端工作

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

问题2:软实时 通过Erlang/OTP设计可扩展性(Francesco Cesarini&Steve Vinoski):

如果您的系统吞吐量为每秒一百万封邮件,同时处理了一百万个请求,则处理请求并将其传递给收件人需要1秒的时间。但是,如果在峰值期间发送了200万个请求,吞吐量应该不会降低;不是一些请求,但所有请求都应在2秒内处理

Erlang/Elixir真的能做到吗

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

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

什么工具适合管理Erlang/Elixir的部署/监视/操作

问题4:优化 我知道WhatsApp使用Erlang来支持他们的服务。他们在Erlang上做了很多优化。有这方面的信息吗?如果我们需要优化Erlang服务,我们如何启动它?

回答问题2

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

大多数非常普通的服务器可以同时处理超过一百万个进程。由于每个请求都是一个进程,因此当提供完成请求所需的cpu资源时,每个请求都是完整的

进程调度是协作的,而不是抢占式的,允许上下文切换比操作系统中的切换发生得快得多。最后,Elixir和Erlang默认使用CPU上的所有内核

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

Erlang VM是为电信系统设计的,以支持许多电话的并发性。它也是在早期设计的,当时内存和CPU与今天相比非常有限

问题一的答案

TL;医生:是的,长生不老药已经足够成熟了

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

以下几点应针对您的表格

  • Elixir web应用程序在Nginx或Apache反向代理后运行良好
  • Elixir使编写并发代码变得非常容易,使其适合于长时间运行的请求,使用负载平衡器将请求定向到服务器a或服务器B
  • Elixir支持Redis、Mongo和许多其他后端。我个人在一个部分用Rails编写,部分用Elixir的Phoenix框架编写的应用程序之间共享了相同的数据库表。我甚至在两者之间共享了会话数据
  • Elixir可以写入用于编译(.ex扩展名)和脚本(.exs)的文件中,这使得它适合于脚本编写。Elixir的并发模型使得编程计划作业非常容易,而无需使用外部命令行cron。最后,Elixir有许多用于文件管理和操作系统特定功能的内置库
Elixir应用程序,无论是Web应用程序还是纯后端应用程序,都可以轻松构建有状态的应用程序。它内置于echo系统中,不需要任何第三方API。此外,作为一款Phoenix web应用程序,它首先是一款有状态的长生不老药应用程序,带有一些附加组件以帮助开发web应用程序。所以,你可以做一些事情,比如定期安排日程


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

请格式化Q1中给出的表。我不理解Q1。我猜你的问题太广泛,不太适合问答形式。要回答你的问题,需要有人再写一本书。仅供参考:这本书来自@Sasajuri。而且,我几年前确实写过。这也是我写这个软件包的灵感所在。水平缩放是一个比我已经提供的相当长的答案大得多的答案。我想你应该用谷歌搜索一下。很多人都希望从分布式erlang开始,并从那里开始工作。多节点主要是EVM的一个功能。Elixir为本地和远程进程提供支持。关于第二季度,如果一台机器每秒只能处理100万个请求,那么
+ ---------------------- + ------------------------- + --------- +
| 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    |
+ ---------------------- + ------------------------- + --------- +