了解Akka Actors和异步IO的好处

时间:2014-06-26 20:22:37

标签: scala asynchronous concurrency akka actor

我是stackoverflow的新手,我一直在努力探讨“Akka Actors”和这种异步通信是如何工作的。所以基本上,我的webapp将(可能)有数千名用户与之通信,请求和编写我拥有的数据库。基本的持久性webapp ...

所以基本上,我已经多次听说Async IO是构建这种解决方案的方法,当然Akka是可以去的地方。我的问题是,

如果一个Akka演员一次只能处理一条消息,这里究竟有什么好处,我错过了什么,Akka.ActorSystem是否会根据计算机中的线程数自动创建和销毁演员?

最重要的是,如果某些客户端具有相当数据库详尽的任务,那么这将基本上阻止参与者,直到它能够发送正确的响应为止?这是期货进来,我未能真正了解期货是什么。如果你不得不最后调用future.get()(这是一个阻塞操作)......有什么意义呢?

我目前正在使用Scalatra 2.3,这有点令人讨厌,因为他们的所有教程都说他们在Scalatra 2.3中删除了它,同时他们将scala.concurrent删除了,根据Scala 2.11.x发行说明,Actors已被删除支持Akka。所以这一切都只是自相矛盾,我发现自己越来越混淆使用什么,如何使用它,它做什么,有什么优势等等。如果有人可以帮助澄清这些问题,我很乐意听到并学习。非常感谢!

1 个答案:

答案 0 :(得分:1)

是的,你是对的,演员可以一次处理一条消息,但你可以通过几种方式对其进行优化,我将尝试解释。 如果actor忙于处理消息,则所有传入消息将在缓冲区中排队。但是如果消息的速率太高,那么消息最终会下降。您可以使用邮箱来避免这种情况,并将您的任务分配给多个actor以避免拥塞。 This link会为您提供有关邮箱的更多信息。

关于创建actor,你可以设计你的系统,它会为你想要执行的每个任务产生actor,当该任务完成时,actor可以向自己发送一个kill信号,或者一个主演员可以告诉演员要自杀。对于这样一个系统的例子,你可以view this因为它可以为你清除很多东西。

关于让演员不间断地异步工作你可以通过利用像这样的巧妙技巧来做到这一点,例如:

def myFuncInActor( num1: Int,num2: Int): Unit = {
    Future { // actor doing a task asynchronously
      val sum = num1 + num2
      val avg = sum/2
      // anything you want to do here
      myCaseClass(avg)
    } pipeTo self    // actor sending the result to itself
  }

如果您对使用akka演员不满意,您也可以使用zeroMQ完成所有这些操作。我认为你也应该接受它。我希望您发现此信息有用。