我正在撰写一篇描述可扩展系统所使用技术基础的文章。我之前在自学习练习中研究过Erlang。我已经阅读了几篇文章,但未能回答以下问题:
Erlang的实现是什么使它具有可扩展性?是什么使它能够比Java等技术更有效地运行并发进程?
函数式编程和并行化之间有什么关系?使用Erlang的声明性语法,我们是否实现了运行时效率?
过程状态不会变得沉重吗?如果我们有数千个并发用户并且生成了与gen_server或任何其他等效模式相同数量的进程,则每个进程都将保持一个状态。有这么多的流程,它不会耗尽内存吗?
如果进程必须进行数据库操作并且我们生成该进程的多个实例,那么最终数据库将成为瓶颈。即使我们使用Apache-PHP等传统模型,也会发生这种情况。几乎每个业务应用程序都需要数据库访问那么我们从使用Erlang中获得了什么?
流程重启有何帮助?当逻辑或数据出错时,进程崩溃。 OTP允许您重新启动进程。如果逻辑或数据没有改变,为什么这个过程不会再次崩溃并且总是崩溃?
大多数文章都赞扬Erlang引用它在Facebook和Whatsapp中的使用。我赞扬Erlang具有可扩展性,但也希望在技术上证明其可扩展性。
即使我在现有链接上找到这些查询的答案,也会有所帮助。
此致
佳日
答案 0 :(得分:0)
不久:
你可以选择一些像F#,Scala / Akka,Haskell这样的模仿者 - 他们试图从Erlang复制功能,但只有Erlang从一个目的出生并且只为一个目的而诞生 - 电信。
您可以在erlang.com上找到其他问题的答案,我建议您访问手册。 Erlang是为其他目标而构建的,所以它不适用于所有任务,如果你询问像php这样糟糕的事情,Erlang就不会成为你的语言。
答案 1 :(得分:0)
我还没有Erlang开发人员(但是)从我所读到的内容来看,它使得它具有很强的可扩展性的一些特性是Erlang有自己的轻量级进程,它们使用消息传递来相互通信。因此,当使用例如多线程Java应用程序时,不存在共享状态和锁定的情况。
与Java相比的另一个不同之处在于Erlang VM在每个运行的小进程上进行垃圾收集,与只为每个VM进行垃圾收集的Java相比,它几乎不需要任何时间。
如果您遇到数据库连接瓶颈的问题,可以先使用针对可能是复制的PostgreSQL集群运行的数据库池应用程序,或者如果您仍然遇到瓶颈,请使用Mnesia,Riak或CouchDB的多重复制NoSQL设置。
我认为当您遇到只出现随机且仅在满足特定条件时出现的罕见错误时,进程重启非常有用。一旦重新启动应用程序导致应用程序崩溃的错误应该通过断路器进行最佳修复或处理,以使其不会进一步扩散。
答案 2 :(得分:0)
以下是重启过程的一种方法。不必处理所有可能的错误情况。假设你有一个分割数字的程序。有些人输入零除以。而不是检查可能的错误(以及更多),只需编写“快乐案例”,并在进入3/0时让进程崩溃。它只是重新启动,他可以弄清楚他做错了什么。
您可以将其扩展为无数种情况(尝试从不存在的文件中读取,因为用户拼写错误等等)。
答案 3 :(得分:0)
流程重启的重要原因是每次都不会发生每个错误,并且检查它是否有效是很冗长的。
错误处理通常是冗长的,因此编写它与散布执行任务的逻辑处理可能会使代码更难理解。将该逻辑移出任务之外,可以更清楚地区分“做事”和“做事”。代码和"它破坏了#34;码。你只是让有问题的东西失败了,并按照监督方的需要处理它。
由于大多数错误并不意味着整个程序必须停止,只有那个特定的东西不能正常工作,只需重新启动损坏的部分,您就可以继续在功能退化的状态下运行当你修复问题时,而不是失败。
还应该注意,故障恢复是有限的。你必须列出在一定时间内失败多少的限制。如果超过该限制,则故障会传播到另一级别的监督。每次重启包括进行任何所需的进程初始化,这有时足以解决问题。例如,在开发中,我意外删除了与进程关联的数据库文件。崩溃级联到文件最初创建的级别,此时问题自行解决,一切都继续进行。