阿卡是真正的演员模特吗?

时间:2015-11-07 23:30:42

标签: akka actor

在使用Scala Akka时,我们仍然考虑阻止IO,并尝试使用模式来避免它,我觉得使用线程没有任何区别。隐式异步IO是一个巨大的差异化因素,Erlang和Go在语言层面提供它,而Scala Akka则不然。我觉得斯卡拉阿卡不是真正的演员模特。

这是一篇受欢迎的博文Don't use Actors for concurrency,但它不是演员模特的问题,它纯粹是阿卡的问题。

2 个答案:

答案 0 :(得分:4)

Akka实现了Carl Hewitt et al 在1973年指定的演员模型:演员可以在收到消息时

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

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

Akka通过公开可以发送命令并可以从中接收结果的ActorRef,为以Actor模式方式呈现的网络操作提供IO工具。 Akka Streams包括异步消费和从I / O通道生成数据。

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

答案 1 :(得分:2)

你的问题的前提是不准确的  (" ......斯卡拉阿卡没有。")。来自akka documentation

  

演员给你:

     

简单和高级的并发和并行抽象。   异步,非阻塞和高性能事件驱动   编程模型。非常轻量级的事件驱动流程(几个   每GB堆内存百万个演员)。

传递给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对于并发计算(I agree with)要好得多,而Actors用于维护状态。它没有声称Actors不能并发。

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