在Java世界中,使用3层体系结构(表示层,服务层和DAO层)设计应用程序被认为是最佳实践。
但是我当前的应用程序使用Scala和Akka。在我的一位演员中,收到一些消息后,我需要从数据库中检索国家列表。如果我使用过Java,则很可能会创建CountryService接口及其实现以及CountryDao相应的实现。
但是Akka的做法是什么?我应该CountryService按演员包吗?我认为这是个坏主意,因为在这种情况下,我的演员在收到某些消息后将需要发送另一条消息来检索所有国家,并在对原始发件人做出响应之后。
这纯粹是基于我使用 Akka 的经验,其他人可能会不同意。
如果您的乡村演员没有状态,则不要将其设为演员。只需简单地使用 Scala 的FutureAPI 并将其通过管道传回调用它的 Actor 即可。这样,数据库调用就可以在与 Actor 完全不同的执行上下文上运行(您不应该在 Actor 内部执行阻塞调用)。如果您正在考虑缓存,那么我的观点是,缓存仍然不是真正的状态,并且使用Guava Cache是线程安全的并且可以解决问题。
所以这看起来像这样:
class MyActor(countryService: CountryService) extends Actor {
// ...
val result: Future[Countries] = countryService.getCountries
result.pipeTo(self)
// ...
def recieve = {
case Countries(c) => // use c
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,您可能希望将其包装成单独的CountryActor,但这些情况很特殊:即您严重依赖 Actor 路径并希望在特定路径访问服务 Actor、希望专门处理错误、具有一些重试逻辑等。
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |