【问题标题】:Actor model vs object oriented model演员模型与面向对象模型
【发布时间】:2016-12-19 04:24:41
【问题描述】:

我在网上搜索了很长时间,没有找到Actor模型克服的面向对象模型的具体缺点。请帮助我提供一些指示和解释。

提前致谢。

【问题讨论】:

标签: oop akka actor-model


【解决方案1】:

面向对象编程这个词最初来自 Alan Kay 和 Smalltalk。 它强调消息传递是其主要功能。这就是 OOP 最初的意思。

一旦 C++ 和 Java 出现,面向对象编程一词的含义就略有不同。它演变成一些人所说的“面向类的编程”。

Actor 模型重新强调了最初的 OOP 概念,即消息传递是核心基础。

演员模特专业人士:

  • 在分布式系统中工作得更好
  • 在许多情况下更易于理解架构
  • 模拟具有多个“参与者”的现实世界现象/复杂系统
  • 与函数式编程风格高度兼容(请参阅 Smalltalk)

Actor 模型缺点:

  • 很难对算法进行推理,因为它不仅仅存在于一个地方。它被分成不同的演员/文件,你必须追查它并遵循代码。
  • 同样,多个算法可以在多个参与者之间混合使用。因此,您可能会转到一个文件并阅读某个 Actor 的代码以遵循该算法,但会因为其他算法也混入同一个 Actor 中而感到困惑。
  • 传统的信号量式锁定不可能。必须使用可能更复杂的 STM 样式。
  • 更难获得“返回值”。 Actor 模型是“一劳永逸”。您必须弄清楚如何将“返回值”返回给原始请求者。这会增加很多开销,因为现在您必须设置一种方式来接收它并通过整个系统传递上下文(uniqueId / taskId)。您还需要管理状态以保存该信息,直到“响应”返回。如果没有 Actor 模型,它们将只是块作用域中的局部变量。

【讨论】:

  • 这实际上是对@SugaRaj 答案的一个很好的补充
  • 除了它是在 Simula-67 中开发的,其中多个对象同时拥有自己的生命,这仅在 Erlang 中重复。虽然 Smalltalk 只允许消息更改对象的内部状态 - 与 C++/Java 完全相似
【解决方案2】:

OO模型的缺点:

  1. 传统的 OOP 语言在设计时并未考虑并发性。它是 很容易引入竞争条件,因为它使用共享 状态。
  2. 程序员必须识别并修复所有可能的问题 区域通过使用锁定机制。
  3. 对于简单的程序,锁定很容易实现。但随着程序变得复杂,锁定的实现也变得复杂。

Actor 模型通过使用 share nothing 模型克服了这个问题,因此不影响并发,也不需要锁定机制。

【讨论】: