Ruby 语言与可伸缩性的关系

Ruby 语言与可伸缩性的关系,ruby,scala,erlang,scalability,Ruby,Scala,Erlang,Scalability,我在Erlang社区网站Trapexit中看到以下声明: Erlang是一种使用的编程语言 构建大规模可扩展的软硬件 实时系统要求 高可用性 我还记得在某个地方读到Twitter从Ruby切换到Scala以解决可伸缩性问题 因此,我想知道编程语言和可伸缩性之间的关系是什么? 我认为可伸缩性只取决于系统设计、异常处理等。这是因为语言的实现方式、库还是其他原因 希望开悟。谢谢。Erlang针对电信环境进行了高度优化,正常运行时间约为5.9秒 它包含一组名为OTP的库,可以“动态”地将代码重新加载到应

我在Erlang社区网站Trapexit中看到以下声明:

Erlang是一种使用的编程语言 构建大规模可扩展的软硬件 实时系统要求 高可用性

我还记得在某个地方读到Twitter从Ruby切换到Scala以解决可伸缩性问题

因此,我想知道编程语言和可伸缩性之间的关系是什么?

我认为可伸缩性只取决于系统设计、异常处理等。这是因为语言的实现方式、库还是其他原因


希望开悟。谢谢。

Erlang针对电信环境进行了高度优化,正常运行时间约为5.9秒

它包含一组名为OTP的库,可以“动态”地将代码重新加载到应用程序中,而无需关闭应用程序!此外,还有一个监控模块框架等,因此当某个模块出现故障时,它会自动重新启动,否则故障会逐渐在链上运行,直到它到达可以处理它的监控模块

当然,这在其他语言中也是可能的。在C++中,可以在加载时加载DLL,加载插件。在Python中,您可以重新加载模块。在C#中,您可以动态加载代码、使用反射等

只是该功能内置于Erlang中,这意味着:

  • 它更标准,任何erlang开发人员都知道它是如何工作的
  • 减少重新实现自己的东西
也就是说,语言之间存在一些根本性的差异,有些是解释的,有些是字节码,有些是本机编译的,因此运行时的性能和类型信息的可用性等都不同

Python的运行库周围有一个全局解释器锁,因此无法使用SMP

Erlang最近才添加了一些更改以利用SMP

总的来说,我同意你的观点,我认为一个重要的区别在于内置的库,而不是语言本身的根本区别


最终,我觉得任何一个项目,无论它是用什么语言写的,都有陷入困境的风险。正如您所说,我觉得体系结构和设计对于可伸缩性非常重要,选择一种语言而不是另一种语言不会神奇地带来令人敬畏的可伸缩性…

首先,您必须区分语言及其实现。例如,ruby语言支持线程,但在官方实现中,线程不会使用多核芯片

然后,如果一种语言/实现/算法支持并行计算(例如通过多线程),并且当CPU数量增加时,它表现出良好的加速比,那么它通常被称为可伸缩的(参见阿姆达尔定律)


有些语言,如Erlang、Scala、Oz等,也有语法(或尼斯库),有助于编写清晰、漂亮的并行代码。

Erlang是一种考虑并发性的语言。虽然大多数语言都依赖操作系统来实现多线程,但Erlang中内置了并发性。Erlang程序可以由数千到数百万个极其轻量级的进程组成,这些进程可以在单个处理器上运行,也可以在多核处理器上运行,或者可以在处理器网络上运行。Erlang还支持进程间的消息传递、容错等语言级别的支持。Erlang的核心是函数式语言,函数式编程是构建并发系统的最佳范例


简而言之,在Erlang中创建一个分布式、可靠和可扩展的系统很容易,因为它是专门为此目的设计的语言

Erlang来自另一种思考可靠性以及如何实现可靠性的文化。理解区域性很重要,因为Erlang代码不会因为其Erlang特性而通过magic变得容错

一个基本的想法是,高正常运行时间不仅来自很长的平均故障间隔时间,而且还来自很短的平均恢复时间(如果发生故障)

然后人们意识到,当检测到故障时,需要自动重启。人们意识到,在第一次检测到某些不太正确的情况时,应该“崩溃”以导致重启。恢复需要优化,可能的信息损失需要最小化

许多成功的软件都遵循这种策略,如日志文件系统或事务日志数据库。但绝大多数情况下,软件往往只考虑故障之间的平均时间,并向系统日志发送有关错误指示的信息,然后尝试继续运行,直到不再可能。通常需要人工监控系统并手动重新启动

这些策略大多以Erlang中的库的形式存在。语言特性的一部分是进程可以相互“链接”和“监视”。第一个是一个双向合同,即“如果你撞车,我会收到你的撞车信息,如果没有被困住,我会收到你的撞车信息”,第二个是“如果你撞车,我会收到关于它的信息”

链接和监视是库用来确保其他进程尚未崩溃的机制。流程被组织成“监督”树。如果树中的工作进程失败,主管将尝试重新启动它,或树中该分支的同一级别的所有工作进程。如果失败,它将升级,等等。如果顶级主管放弃应用程序崩溃,虚拟机退出,此时系统操作员应重新启动计算机

进程堆之间的完全隔离是Erlang运行良好的另一个原因。除了少数例外,不可能“sha”