阿卡。我应该将所有 servicies/DAOs 都实现为演员吗?
Akka. Should I implement all servicies/DAOs as actors?
在 Java 世界中,使用 3 层架构(表示层、服务层和 DAO 层)设计应用程序被认为是最佳实践。
但我目前的应用程序使用 Scala 和 Akka。在我的一位演员中,收到一些消息后,我需要从数据库中检索国家列表。如果我使用了 Java,我很可能会创建 CountryService
接口及其实现,以及具有相应实现的 CountryDao
。
但是 Akka 的方法是什么?我应该按演员包装 CountryService
吗?我认为这是个坏主意,因为在这种情况下,我的演员在收到一些消息后需要发送另一条消息来检索所有国家并在回复原始发件人之后。
这完全基于我使用 Akka 的经验,其他人可能会不同意。
如果您的 Country Actor 没有状态 那么请不要将其设为 Actor。只需简单地使用 Scala 的 Future
API 并将其通过管道返回给调用它的 Actor。这样,数据库调用可以 运行 在与您的 Actors 完全不同的执行上下文中(您不应该在 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,想要特殊处理错误,有一些重试逻辑等
演员的数量与layers/services的数量无关。每个服务可以有数千个参与者,或者 none 个。取决于演员在那种情况下是否有用。
使用 actor 有很多用途:隐藏状态、负载平衡和在 children 之间分配工作,"let it crash" 模型的容错:将危险工作委托给 children并选择监管策略。
创建和使用 actor 非常便宜,发送消息也是如此。但是当然你不需要他们来做所有的事情。问问自己:演员在这里带来什么优势?
在 Java 世界中,使用 3 层架构(表示层、服务层和 DAO 层)设计应用程序被认为是最佳实践。
但我目前的应用程序使用 Scala 和 Akka。在我的一位演员中,收到一些消息后,我需要从数据库中检索国家列表。如果我使用了 Java,我很可能会创建 CountryService
接口及其实现,以及具有相应实现的 CountryDao
。
但是 Akka 的方法是什么?我应该按演员包装 CountryService
吗?我认为这是个坏主意,因为在这种情况下,我的演员在收到一些消息后需要发送另一条消息来检索所有国家并在回复原始发件人之后。
这完全基于我使用 Akka 的经验,其他人可能会不同意。
如果您的 Country Actor 没有状态 那么请不要将其设为 Actor。只需简单地使用 Scala 的 Future
API 并将其通过管道返回给调用它的 Actor。这样,数据库调用可以 运行 在与您的 Actors 完全不同的执行上下文中(您不应该在 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,想要特殊处理错误,有一些重试逻辑等
演员的数量与layers/services的数量无关。每个服务可以有数千个参与者,或者 none 个。取决于演员在那种情况下是否有用。
使用 actor 有很多用途:隐藏状态、负载平衡和在 children 之间分配工作,"let it crash" 模型的容错:将危险工作委托给 children并选择监管策略。
创建和使用 actor 非常便宜,发送消息也是如此。但是当然你不需要他们来做所有的事情。问问自己:演员在这里带来什么优势?