Akka是真正的演员模型吗?

Is Akka real actor model?

在使用Scala Akka的时候,我们还是想着阻塞IO,用pattern尽量避免,我觉得跟用线程没什么区别。隐式异步 IO 是一个巨大的区别,Erlang 和 Go 在语言级别提供它,而 Scala Akka 则没有。我感觉Scala Akka不是真正的actor模型

有一篇博文很火postDon't use Actors for concurrency,但其实不是actor模型的问题,纯粹是Akka的问题

你的问题前提不准确 (“……Scala Akka 没有。”)。来自 akka documentation:

Actors give you:

Simple and high-level abstractions for concurrency and parallelism. Asynchronous, non-blocking and highly performant event-driven programming model. Very lightweight event-driven processes (several million actors per GB of heap memory).

异步消息传递给 Actor 的基本示例:

val actorSystem = ActorSystem()

val actorRef = actorSystem actorOf Props[SomeActor]

val message = ???  //some message value

actorRef ! message //asynchronous message passing

事实上,akka 超过了 original Actor Model specification 按名称查找 Actors 的能力。

对于 IO 具体而言,akka 提供了许多非阻塞解决方案:

诚然,Scala 语言没有嵌入式 Actor 模型。但是它为并发计算提供了 Futures 和并行集合。

您引用的博客的要点是 Futures 更适合并发计算(),而 Actors 则用于维护状态。它并不是说 Actors 不能并发。

此外,akka 不仅仅是演员。有代理、有限状态机、akka 流(实现 reactive manifesto)和 akka-http 库。

Akka 实现了 Carl Hewitt 等人 在 1973 年指定的 Actor 模型:Actor 可以在收到消息后

  • 向它知道的 actor 发送有限数量的消息
  • 创建有限数量的演员
  • 确定要应用于下一条消息的行为

这并没有说明 I/O 应该如何处理。另一方面,将阻塞方法调用自动转换为 actor 挂起方法调用是对模型的违反:actor 仅对消息起作用,没有别的,并声明一些任意方法调用以防止这种情况在某些(可能是无限的)时间内发生是不是模型的一部分。

Akka 为以 Actor 模型方式呈现的网络操作提供 IO 设施,方法是公开一个可以向其发送命令并可以从中接收结果的 ActorRef。 Akka Streams 包括来自和到 I/O 个通道的数据的异步消费和生产。

我希望这能解释为什么我的总体回答是问题的前提是有缺陷的。