Erlang/Elixir在现实世界中是如何工作的
在读了两本书,编程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项目时也是如此 以下几点应针对您的表格Erlang/Elixir在现实世界中是如何工作的,erlang,elixir,Erlang,Elixir,在读了两本书,编程Erlang(Joe Armstrong)和编程Elixir(Dave Thomas)之后,我对现实世界中的Erlang/Elixir有一些问题 问题1:统一后端开发 我在一次技术讲座中看到一张桌子(我做了一个截图,但我忘记了来源。如果你知道,请留下评论): 这是真的吗?Erlang/Elixir是否成熟到可以处理所有后端工作 如果为真,这个Erlang/Elixir代码库是否是单片的 问题2:软实时 通过Erlang/OTP设计可扩展性(Francesco Cesarini&
- Elixir web应用程序在Nginx或Apache反向代理后运行良好
- Elixir使编写并发代码变得非常容易,使其适合于长时间运行的请求,使用负载平衡器将请求定向到服务器a或服务器B
- Elixir支持Redis、Mongo和许多其他后端。我个人在一个部分用Rails编写,部分用Elixir的Phoenix框架编写的应用程序之间共享了相同的数据库表。我甚至在两者之间共享了会话数据
- Elixir可以写入用于编译(.ex扩展名)和脚本(.exs)的文件中,这使得它适合于脚本编写。Elixir的并发模型使得编程计划作业非常容易,而无需使用外部命令行cron。最后,Elixir有许多用于文件管理和操作系统特定功能的内置库
要明确的是,当我说有状态时,我的意思是你可以设计你的应用程序来管理状态。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 |
+ ---------------------- + ------------------------- + --------- +