Java 阿克卡。我是否应该作为参与者实施所有服务/DAO?

Java 阿克卡。我是否应该作为参与者实施所有服务/DAO?,java,scala,akka,Java,Scala,Akka,在Java世界中,使用三层体系结构(表示层、服务层和DAO层)设计应用程序被认为是最佳实践 但我当前的应用程序使用Scala和Akka。在我的一个演员中,在收到一些消息后,我需要从DB中检索国家列表。如果我使用Java,我很可能会创建CountryService接口及其实现,以及带有相应实现的CountryDao 但是阿克卡的方法是什么呢?我应该按参与者包装CountryService吗?我认为这是个坏主意,因为在这种情况下,我的演员在收到一些消息后需要发送另一条消息以检索所有国家,并在回复原始

在Java世界中,使用三层体系结构(表示层、服务层和DAO层)设计应用程序被认为是最佳实践

但我当前的应用程序使用Scala和Akka。在我的一个演员中,在收到一些消息后,我需要从DB中检索国家列表。如果我使用Java,我很可能会创建
CountryService
接口及其实现,以及带有相应实现的
CountryDao


但是阿克卡的方法是什么呢?我应该按参与者包装CountryService吗?我认为这是个坏主意,因为在这种情况下,我的演员在收到一些消息后需要发送另一条消息以检索所有国家,并在回复原始发件人后。

这纯粹是基于我与Akka的经验,其他人可能会不同意

如果你的国家演员没有州,那么不要让它成为演员。只需简单地使用Scala的
Future
API,并将其传回调用它的参与者即可。这样,数据库调用可以在完全不同于您的参与者的执行上下文上运行(您不应该在参与者内部执行阻塞调用)。如果您正在考虑缓存,那么我的观点是缓存仍然不是真正的状态,并且使用是线程安全的

这看起来像这样:

class MyActor(countryService: CountryService) extends Actor {
  // ...
  val result: Future[Countries] = countryService.getCountries
  result.pipeTo(self)
  // ...
  def recieve = {
    case Countries(c) => // use c
  }
  // ...
}

有些情况下,您可能希望将其包装到单独的
CountryActor
,但这些情况是特殊的:即,您严重依赖Actor路径,希望在特定路径上访问服务Actor,希望专门处理错误,具有一些重试逻辑,等等。

参与者的数量与层/服务的数量无关。每个服务可以有数千名演员,或者根本没有。这取决于参与者在该上下文中是否有用

使用参与者在很多方面都很有用:隐藏状态、负载平衡和在孩子之间分配工作、使用“让它崩溃”模型进行容错:将危险工作委托给孩子,以及选择监督策略


创建和使用演员非常便宜,发送消息也很便宜。但当然,你并不需要他们的一切。问问自己:演员在这里有什么优势?

Akka与您的N层架构没有直接关系。你在阿克卡的演员应该自己处理他们必须做的工作。顺便说一句,你似乎不理解Akka封面的用例。@LuiggiMendoza那么我应该将顺序服务与演员混合使用吗?也就是说,我是否应该以java方式创建
CountryService
,并将其注入我的参与者以供进一步使用(而不是使用另一个参与者支持
CountryService
)?