gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:46:25 29 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




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

Q1:统一后端开发

我在一个tech talk中看到一个表格(我截图了,但是忘记出处了,知道的请留言):

+ ---------------------- + ------------------------- + --------- +
| 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):

If your system throughput is a million messages per second and a million simultaneous requests happen to be processed, it should take 1 second to process and deliver a request to its recipient. But if during a spike, two million requests are sent, there should be no degradation in the throughput; not some, but all of the requests should be handled within 2 seconds.



Erlang/Elixir 真的能做到吗?

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

Q3:实时可扩展性

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

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

Q4:优化

我知道 微信 使用 Erlang 来支持他们的服务。他们对 Erlang 做了很多优化。有关于这方面的信息吗?如果我们需要优化我们的 Erlang 服务,我们如何启动它?

最佳答案

回答 Q2。

Elixir 和 Erlang 可以处理峰值,因为它们的 Web 服务器通常为每个请求生成一个新的 Erlang 进程。这是可以实现的,因为 Erlang 进程比 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 项目时也是如此。

以下几点应该适用于您的餐 table 。

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

  • Elixir 应用程序,无论是 Web 应用程序还是纯后端应用程序,都可以轻松构建有状态的应用程序。它内置在回声系统中,不需要任何 3rd 方 API。此外,Phoenix Web 应用程序首先是一个有状态的 Elixir 应用程序,带有一些附加组件来帮助开发 Web 应用程序。因此,您可以执行诸如定期安排之类的事情。

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

    关于erlang - Erlang/Elixir 如何在现实世界中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43709642/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com