【发布时间】:2014-10-31 08:30:55
【问题描述】:
我有一个可以接收“getItems”消息的演员“ItemProvider”。 ItemProvider 管理项目的项目。所以我可以有几个“getItems”消息为项目 A 请求项目,而其他“getItems”消息为项目 B 请求项目。
“itemProvider”第一次收到这样的消息时,它需要调用服务来实际获取项目 (这可能需要一分钟服务返回一个未来,所以它不会阻止演员)。在此等待期间,其他“getItems”消息可能会到达。
项目“ItemProvider”缓存它从服务接收到的“Items”。 因此,在 1 分钟的加载时间之后,它可以立即提供商品。
我很确定“ItemProvider”应该使用 Akka 的成为功能。但是它应该如何处理它不能立即服务的客户呢?
我可以想到以下选项:
-
ItemProvider 持有一个列表pendingMessages。并且它不能提供的消息被添加到这个列表中。当 ItemProvider “准备好”时,它将处理待处理的客户端
-
ItemProvider 将消息发送回其父级。并且家长会重新发出消息
-
ItemProvider 使用调度程序。并在未来再次得到消息。
-
也许不使用 become 而是使用 AbstractFSM 类?
有人知道实现 ItemProvider 的最佳 Akka 方法吗?
【问题讨论】:
-
我看起来可以为他们服务,因为您使用的是
Future,但如果您在很短的时间内收到相同的请求,这可能是多余的工作。您需要一种方法来告诉后续请求您已经有了响应。所以,是的,您可能需要从请求到未来的Map,当有新请求到来时,请检查Map,如果该请求有Future,请发送Future也响应这个客户。 -
我认为你不能使用
become。当你有一个状态机时你需要become,并且你有多个状态机。每个单独的请求都有一个状态机,有两种状态:正在获取和已获取。 -
我完全是 akka 的初学者。但我不明白为什么我不能将客户放在待处理列表中。当物品准备好时,Itemprovider 可以向所有等待的客户发送他们的结果。在我看来这是一个不错的选择
-
啊,你也可以。当然。
-
@jack,如果您不介意它不在 java 中,我可以编写一个基于 scala 的解决方案来解决您的问题。如果你想看,请告诉我。