我有 4 个 Web 服务需要按顺序调用:
w1
w2
w3
w4
因此,每个用户都会调用 4 个 Web 服务。
我将这些服务包装在 Akka 解决方案中,以便逐个调用每个服务。 这些电话中的每一个都应该在
之内进行吗?- 单个 Akka Actor ?
- 为每个单独的服务创建一个 Akka 线程?
w4 将详细信息返回给用户。因此,如果 10 个用户使用选项 1 请求详细信息,则会创建 10 个参与者,使用选项 2 则会创建 40 个参与者。
有什么指示吗?
最佳答案
这取决于你是否需要维持一个状态。如果您想按某种顺序调用这四个服务,并且可以使用一些异步 IO 库(例如 Spray client ),那么您可能可以使用单个参与者并在没有阻塞的情况下理解 Futures,如下所示:
def callW1() : Future[W1Response] = ???
...
def receive : Receive = {
case m : SomeMessage => {
val response : Future[YourResponse] = for {
w1Response <- callW1();
w2Response <- callW2(w2Response);
w3Response <- callW3(w2Response, w3Response);
w4Response <- callW4();
} yield w4Response
val savedSender = sender()
response.foreach(savedSender ! _)
}
}
处理消息和 future 的线程数量可以通过 .config 文件配置(默认为 20)。
另一方面,如果您想要缓存 Web 服务响应,您最好为每个具有缓存逻辑的 Web 服务创建一个包装器 Actor,并创建一个管理其调用顺序的主管 Actor。
以下是有关此主题的更多阅读内容:Actors vs Futures
关于java - 这是 Akka 的有效使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490235/