【问题标题】:Is the actor model limited to specific languages?演员模型是否仅限于特定语言?
【发布时间】:2012-05-06 14:15:12
【问题描述】:

我正在阅读关于 Erlang/OTP 和 actor 模型的 interesting blog post。我还听说 Scala 支持演员模型。从我目前收集的少量信息来看,actor 模型将处理分解为通过传递消息相互通信的组件。通常,这些进程是不可变的。

这些功能在架构级别是特定于语言还是更多?更具体地说,你不能只用几乎任何语言实现相同的参与者模型,并且只使用某种形式的消息队列在工作进程之间传递消息吗? (例如,使用 celery 之类的东西)。还是像 Erlang 和 Scala 这样的语言只是透明地做到这一点,much faster

【问题讨论】:

    标签: scala architecture erlang actor


    【解决方案1】:

    当然,您几乎可以用任何语言定义“Actor 库”,但在 Erlang 中,该模型已融入该语言,并且实际上是唯一可用的并发模型。

    虽然 Scala 的演员系统实施得很好,但归根结底,它仍然容易受到 Erlang 无法避免的一些危险的影响。我会提请你注意这个paper

    对于以任何支持共享可变状态的命令式语言实现的任何 Actor 库都是如此。

    Nodes.js 是一个有趣的例外。正在对节点之间的参与者进行一些工作,这些参与者可能表现出与 Erlang 相同的隔离属性,仅仅是因为没有共享的可变状态。

    【讨论】:

    • 谢谢@dsmith。那很有意思。因此,如果我理解这一点,共享可变状态是问题的主要来源。据我所知,任何将序列化任务/数据传递给工作进程的基于消息队列的架构都应该对此免疫。因此,它是否与演员模型兼容?因此可以假设,例如celery 已经实现了actor模型?
    • 关键是可变状态的隔离。 Erlang 在轻量级进程中隔离可变状态。节点状态将在具有单个执行线程的 OS 进程中隔离。而且,是的,像 celery/rabbitmq 这样的消息传递解决方案也会表现出相同的品质。
    • 再次感谢。我接受了您的回答(连同@talg 提供的额外信息,这对我来说真的很完整)。现在对 erlang 有了更好的了解,但知道 Actor 模型仍然可以用 python/celery/rabbitmq 等实现(尽管形式有点限制)很有用。
    【解决方案2】:

    Actor 模型限于任何特定平台或编程语言,它毕竟只是一个模型。

    Erlang 和 Scala 对该模型有非常好的和有用的实现,它非常适合这些平台的典型技术堆栈,并有助于有效地解决某些类型的任务。

    【讨论】:

      【解决方案3】:

      除了上面提到的几点,Erlang actor 模型是您可以编程的唯一方法,这一事实使您的代码从一开始就可扩展。 Erlang 进程是轻量级的,你可以在一台机器上生成 10-100K(我认为你不能用 python 做到这一点),这改变了你处理问题的方式。例如,在我们的产品中,我们使用 Erlang 解析 Web 服务器日志并生成一个 Erlang 进程来处理每一行。这样,如果一个日志行损坏,或者处理它的进程崩溃,其他日志行不会发生任何事情。 另一个区别是,当您开始使用 OTP 时,您将获得流程主管,并且您可以使流程连接起来,因此如果一个终止了其他所有流程。 除此之外,Erlang 还有其他一些不错的功能(可以通过库在其他语言中找到,但在这里它再次被烘焙),例如模式匹配和热部署。

      【讨论】:

      • 事实上,Actor 实现建立在极其轻量级的进程之上,并且您可以在单个 OS 进程中快速生成数十万个这样的 Actor 单元,这使得 Erlang 独一无二。使用重量级操作系统进程或线程的其他实现受到限制。
      • 将这两个答案结合在一起,我现在得到了一个更清晰的画面。为每个日志行生成一个进程听起来很疯狂,但这似乎很好地说明了解决问题的巨大变化。当然不是我什至会在 python 中尝试的东西。而且我确实同意,被语言强制只以这种方式工作可能是有利的。感谢他们让事情变得更加清晰!
      【解决方案4】:

      不,Actor 模型没有特定于语言的内容。实际上,您已经在问题中提到了 Scala,其中演员不是语言的一部分,而是作为库实现的。 (实际上是三个相互竞争的库。)

      但是,就像函数式编程或面向对象编程一样,直接支持 Actor 编程,或者至少支持一些使其更容易实现的抽象,在语言中将导致非常不同的编程体验。任何曾经用 C 语言进行过函数式编程或面向对象编程的人都可能明白这一点。

      【讨论】:

      • 我认为您对在 C 程序中使用 OOP 原则的类比是一个很好的类比。不幸的是,Scala 选择允许不受约束的可变状态。更类似于 clojure 的引用更适合 Scala —— 但可能提高了普通 Java 开发人员的入门门槛。
      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2011-02-01
      • 2014-04-21
      • 2016-02-04
      • 1970-01-01
      相关资源
      最近更新 更多