首页 文章

阿卡 . 我应该将所有服务/ DAO实施为演员吗?

提问于
浏览
4

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

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

但Akka的做法是什么?我应该由演员包裹 CountryService 吗?我认为这是个坏主意,因为在这种情况下,我的演员收到一些消息后需要发送另一条消息来检索所有国家,并在它回复原始发件人之后 .

2 回答

  • 3

    这完全基于我与Akka的经验,其他人可能不同意 .

    如果你的国家演员 would not have state 然后把它管道传回给那个本来应该调用它的Actor . 这样,数据库调用可以在你的Actors完全不同的执行上下文上运行(你不应该考虑缓存,然后我的意见是缓存仍然不是真正的状态,并且使用Guava Cache是线程安全的并且可以解决问题 .

    所以这看起来像这样:

    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,想要特别处理错误,有一些重试逻辑,等等

  • 1

    参与者的数量与图层/服务的数量无关 . 每个服务可以有数千个演员,或者根本没有 . 取决于演员是否在这种情况下有用 .

    使用actor对很多事情很有用:隐藏状态,负载 balancer 和在孩子之间划分工作,使用“让它崩溃”模型容错:将危险工作委托给孩子并选择监督策略 .

    创建和使用actor非常便宜,消息发送也是如此 . 但是你当然不需要它们 . 问问自己:演员带来的优势是什么?

相关问题