阅读两本书后,编程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。并且由于接收到特定过程的消息已序列化,因此数据访问是并发安全的。