12

Erlang 中 Actor 模型的特点之一是透明分布。除非我误解了,否则当你在参与者之间发送消息时,理论上你不应该假设它们在同一个进程空间中,甚至位于同一台物理机器上。

我一直认为分布式容错系统需要仔细的应用程序设计来解决围绕排序/因果关系共识(以及其他)的固有问题。

我很确定 Erlang 不会承诺透明地解决这些问题,所以我的问题是,Erlang 开发人员如何应对这个问题?您是否将您的应用程序设计为好像所有参与者都在同一个进程空间中,然后只在实际分发它们时才解决分发问题?

如果是这样,Erlang 的这种透明分布特性是否真的只涉及用于远程消息传递的有线协议,而不是真正的透明,因为真正的分布式应用程序仍然需要在应用程序层进行仔细设计?

4

3 回答 3

3

事实上,Erlang 确实透明地解决了这些问题。它可以做到这一点,因为它是一种具有不可变(单赋值)变量的函数式语言。它使用Actor 模型进行并发,并且专门设计用于允许代码的热交换和并发编程,而程序员不必担心同步

维基百科的文章实际上对此有很好的描述。据我了解,爱立信发明了这种语言,是一种对大规模并行电话交换机进行编程的实用方法。

于 2009-06-09T22:03:22.790 回答
3

Erlang 承诺这些事情(http://www.sics.se/~joe/thesis/armstrong_thesis_2003.pdf第 3.1 节(39-40)):

  • 一切都是一个过程。
  • 进程是高度隔离的。
  • 进程的创建和销毁是一个轻量级的操作。
  • 消息传递是进程交互的唯一方式。
  • 进程具有唯一的名称。
  • 如果您知道进程的名称,则可以向其发送消息。
  • 进程不共享资源。
  • 错误处理是非本地的。
  • 流程做他们应该做的事情或失败。

休息由你决定。如果你想知道为什么,请参阅第 2 章。很快,如果你知道它的 PID,即使它在另一块硬件上,你也可以向进程发送消息。除非您收到带有公共秘密的响应,否则您无法确定消息是否到达。当您监视(或链接)进程失败时,您可以确定会收到失败消息。这些是基本元素,您可以使用它们构建您想要的任何东西。

于 2009-06-10T09:23:14.973 回答
3

您是正确的,erlang 本身并不能解决排序/因果关系或共识的问题。erlang 为您抽象的是向本地或远程节点发送消息之间的区别。

我不确定是否真的有可能在语言设计中解决这些问题。这更恰当地属于一个框架。OTP 框架确实有一些工具可以帮助解决这个问题。确实,尽管它在某种程度上取决于您要解决的具体问题。

对于 Erlang VectorClock 实现的一个示例,请查看distributorl Erlang OTP Supervisors 也可能为共识提供一些必要的基础设施,但有人认为共识在异步消息传递分布式系统中是不可能的。有关这方面的更多信息,请参阅您引用的 wiki 页面。

于 2009-06-10T02:01:24.353 回答