使用Akka actor创建内存存储

时间:2014-03-17 08:01:37

标签: scala akka

我正在尝试使用宠物项目熟悉Akka。这基本上是一个锦标赛式的服务器,有一个玩家池。在每一轮中,它应该从池中取出两个随机玩家,互相对战,然后更新记分牌。整个事情都在HTTP服务器后面。通过HTTP Post消息添加玩家,并通过将从JS客户端发送的“播放”消息触发游戏。

我想实现它的方式如下:

  • 一个处理两条消息的PlayerPool actor,“AddPlayer”和“Play”
  • 一个圆形演员,它接收两个玩家的消息,玩一轮,然后更新
  • GameResults演员,包含已播放的轮次列表和每轮的获胜者。它还会显示返回记分板的“GetScore”消息。
  • HTTP层是一个Spray Routing actor,公开调用'GetScore','AddPlayer'和'Play',与PlayerPool和GameResults actor交谈。

我的问题是两个独立的演员正在与GameResults交谈 - 直接Spray和Round演员,并且显然正在创建两个独立的GameResults实例,因此当Round将结果添加到一个实例时,Spray正在阅读来自另一个实例的记分牌。显然我遗漏了一些非常基本的东西,在尝试解决问题之前,我想了解在Akka这样做的主流方式是什么?基本上这个问题可以简化为一个持有不同调用状态的actor。

很高兴有人指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

代码段示例如何将消息从spray传递给游戏结果actor:

希望这会有所帮助

        object SomeApp extends App{

        //create a actor system
          val yourSystem = ActorSystem("Your-System")

          //init spray actor
          val restHandler = yourSystem.actorOf(Props[RestHandler], name = "Rest-spray")

          //init play pool actor
          val playerPoolActor = yourSystem.actorOf(Props[PlayerPool], name = "playerPool")

          //INIT ONLY 1 game result actor
          val gameResultsActor  = yourSystem.actorOf(Props[GameResults], name = "gameResults")

          //spray listen to all IP on port 90210
          IO(Http)(yourSystem) ! Http.Bind(restHandler, interface = "0.0.0.0" , port = 90210)

          class RestHandler extends Actor with RestHandlerRoute  {
            def actorRefFactory = context
            //nice to hold the route in a diffrent trait
            def receive = runRoute(someRoute)
          }
        }

        //only thing the trait is doing is configuring the routing and send message to relavant actor
        trait RestHandlerRoute extends HttpService{me: Actor =>
          import SomeApp._

          val someRoute =
            path("getGameResults")  { get { respondWithMediaType(`text/html`) { complete {
                //case the user requested http://someIP:90210/getGameResults spray will send a message to the game result actor
                gameResultsActor ! getResult
            } ~
        }