【发布时间】:2014-03-17 08:01:36
【问题描述】:
我正在尝试使用一个宠物项目来熟悉 Akka。这基本上是一个锦标赛式的服务器,拥有一群玩家。在每一轮中,它应该从池中随机抽取两名玩家,让他们互相对战,然后更新记分牌。整个事情都位于 HTTP 服务器后面。玩家通过 HTTP Post 消息添加,游戏通过从 JS 客户端发送的“Play”消息触发。
我想到的实现方式如下:
- 一个 PlayerPool Actor 处理两条消息,“AddPlayer”和“Play”
- Round Actor 接收两个玩家的消息,玩一轮,然后更新
- GameResults 演员,包含已玩回合的列表和每回合的获胜者。它还显示返回记分牌的“GetScore”消息。
- HTTP 层是一个喷雾路由参与者,公开对“GetScore”、“AddPlayer”和“Play”的调用,与 PlayerPool 和 GameResults 参与者对话。
我的问题是两个独立的actor正在与 GameResults 对话——直接与 Spray 和 Round actor 对话,显然正在创建 GameResults 的两个独立实例,因此当 Round 将结果添加到一个实例时,Spray 正在读取另一个实例的记分牌。显然我错过了一些非常基本的东西,在尝试解决问题之前,我想了解在 Akka 中这样做的规范方式是什么?基本上这个问题可以简化为一个actor,它在不同的调用中保持一个状态。
很高兴有人指出我正确的方向。
【问题讨论】:
-
显示一些代码,不需要初始化GameResults 2次,可以是单个actor持有结果。
-
两个actor中的同一行代码:val gameResults: ActorRef = context.actorOf(Props[GameResults], "results")
-
这在代码中是否只调用过一次?
-
两次。来自两个不同的演员。
-
所以你要创建 2 个不同的 Actor,你应该只初始化一次 Actor,如果你需要从另一个 Actor 向特定 Actor 发送消息,请使用 Actor ref