是什么使Erlang适用于云应用程序?


9

我们正在开始一个新项目,并在公司的Openstack云实例化上实施(请参阅http://www.openstack.org/)。该项目是我们公司的安全工具。我们目前运行着数百个专用于安全工具的专用服务器,并将它们移至我们公司的openstack实例化。

我公司中的其他项目目前在多个分布式服务器应用程序中使用erlang,而其他Q / A指出,erlang用于几种流行的云服务中。我试图说服其他人考虑将其应用于我们的项目。

erlang在云编程方面的优势是什么?在哪里使用erlang特别合适?


15
定义“云”,我们可以告诉您您可能想知道的内容。术语“云”是市场营销用语,其含义与每个使用它的人不同。

我以为说开放堆栈云就足以定义我们正在实施的内容。参见openstack.org。还是您需要有关该项目的更多信息?这是我们公司的安全工具。我们目前正在运行数百个专用于安全工具的专用服务器,并将它们移至我们公司的openstack实例化。
邓肯

我编辑了问题,希望可以做得更好,并消除“营销”问题。我的问题是为工作选择最佳工具。我是stackexchange的新手,所以不太熟悉。
邓肯2012年

1
具体来说,“云”一词含糊不清,并不表示任何特定含义,它是市场营销方面的说法,您仍然没有定义什么才真正构成了云应用。我个人知道我知道,我认为它的意思,我敢肯定这是不是你认为这意味着,给定的问题。

““云”这个词含糊不清”-好人!这意味着虚拟的东西,您应该指定“东西”是软件,操作系统,单机,多机和网络还是其他。
GlenPeterson 2012年

Answers:


8

除了事实是,Erlang是专门为在并发/并行/分布式情况下运行而开发的,它采用的两种主要技术是:

没有副作用:

这意味着,当您给函数提供要执行的数据时,除非在非常严格的情况下,否则它不会影响系统/运行过程中的任何其他内容。这意味着,如果您一次同时执行一个函数300次,那么该函数的这300次执行将不会影响其他任何一次。

确保无副作用的实现技术称为“不变性”,它大致意味着可能不会发生突变(更改)。这意味着一旦创建变量,该变量的值就不会被修改。Erlang使用“单一分配”实现了此行为,因此,在将值分配给变量后,可能不会再为其分配值。

X = 1.
X = 2. // This is not a valid operation

这样可以确保没有代码可能意外更改X的值而导致竞争状态,因此,它本质上是线程安全的,并且并发使用变得微不足道。这是软件语言中非常罕见的行为,也是Erlang设法很好地适合于并发执行的最大方式。

演员模型:

这是一种特殊的建模方式,对于开发人员而言,这种方式已使并行处理的实现和管理变得非常简单。直接来自维基百科(http://en.wikipedia.org/wiki/Actor_model):

演员模型采用了一切都是演员的理念。这类似于某些面向对象的编程语言所使用的所有对象哲学,但是不同之处在于,通常是按顺序执行面向对象的软件,而Actor模型固有地是并发的。参与者是一个计算实体,它响应收到的消息可以同时进行:向其他参与者发送有限数量的消息;创建数量有限的新演员;指定要用于收到的下一条消息的行为。上述动作没有假定的顺序,可以并行执行。使发送者与发送的通信脱钩是Actor模型的根本改进,它使异步通信和控制结构成为传递消息的模式。


关于“无副作用”,您说“这是软件语言中非常罕见的行为”-我对此感到有些惊讶。Java和C#今天不能这样做吗?您知道在调用函数时必须具有副作用的哪种语言?
NoChance 2012年

3
@EmmadKareem这不是您是否可以编写没有副作用的程序的问题。如您所述,您可以使用Java或C#进行此操作。这是默认值是否无副作用,以及是否为此提供了编译器支持。例如,在Java中,您不能告诉编译器“此方法没有副作用”。反过来,这意味着当您违反规则时,编译器无法警告您!
Andres F.

@EmmadKareem我并不是说不可能在没有副作用的情况下编写C#或Java(尽管非常罕见),而是在说很少的编程语言在语言中内置了严格的策略来将具有副作用的功能与没有副作用的功能区分开。
吉米·霍法

如果Java具有@NoSideEffects批注以放置一种方法来告诉编译器对该方法强制实施无副作用,那将是很好的。在我自己的代码中,我想方法无副作用是很普遍的。当然,某些方法必须是像Java这样的语言中的变体,但许多不是。特别是如果您在设计中喜欢不可变的对象。
GlenPeterson 2012年

吉米·霍法(Jimmy Hoffa)和@AndresF。,感谢您的澄清。
NoChance 2012年

9

Erlang在并发/并行计算中特别强大。实际上,它最初是为此目的而设计的。它与云没有任何内在联系,只是经常将计算繁重的应用程序并行化并部署在“云”实例中,以使其更容易按需增长/缩减容量。

剩下的只是营销方面的事情。


7
Erlang专为容错计算而设计。仅仅是分布式计算是前提条件(如果有人不小心将咖啡洒在单台机器上,那么您至少需要两台机器,如何才能可靠地返回结果),并行并发计算只是分布式计算的特例,因此Erlang也恰好擅长那些。但这不是它的设计目的。
约尔格W¯¯米塔格

1
@JörgWMittag只要我们要剪头发...是的,目的是实现容错能力。它通过并行化实现的。它旨在在AX数字电话交换机中实现目的,该交换机带有两个隔离的并行计算管道,其中一个作为热备用。
pap

1
是的,很抱歉,我应该更加清楚:按照定义,云计算几乎是分布式的,并且通常(并非总是但通常)由廉价且更重要的是不可靠的机器集群实现,但旨在提供可靠的服务。就是使Erlang非常适合的原因。
约尔格W¯¯米塔格

3

与传统硬件部署不同,云的一个方面是您可以在需要时轻松启动新实例。监视其他节点以及其他节点上的进程的能力使构建高度动态的系统变得相对简单,该系统可以添加或删除vm并根据需要对其进行管理。

如果您使用erlang的OTP(开放电信PLatform)框架来构建系统,则尤其如此,该框架同时提供结构和机制(主管树)以支持构建一些相当复杂的东西,而浪费却远远少于您的想象。Erlang处理所有棘手的问题,因此您不必这样做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.