GAE JAVA中的任务队列 - 战斗引擎

时间:2014-12-01 15:09:42

标签: google-app-engine java-ee game-engine pipeline task-queue

我使用Google App Engine Java超过一年。试着写一个简单的策略游戏。 不幸的是,目前的解决方案并不能满我对GAE的经验甚至不够。

我的问题是模拟特定时间的战斗,该战斗应在任务队列中计算。

目前的解决方案:

我在Datastore中有实体: BattleInfo(字段:battleID,startTime,userA,userB)

我准备了两个servlet: BattleInitServlet和BattleServlet。

BattleInitServlet - 执行对数据存储区的查询并加载BattleInfo。任务被添加到战斗队列中:

Queue queue = QueueFactory.getQueue("battle-queue");
    ...
    for(BattleInfo i : list){
        long countdownMillis = i.getStartTime() - currentTime; 
        queue.add(TaskOptions.Builder.withUrl("/battle").param("battleID", i.getBattleID()).method(TaskOptions.Method.POST).countdownMillis(countdownMillis)); 
    }

BattleServlet - 任务将在特定时间开始。我从battleID接收BattleInfo并加载所需的数据。模拟战斗并保存到数据存储区。

使用cron每30分钟执行一次BattleInitServlet。

通过一些模拟,结果还可以。通过大量模拟测试,任务队列被堵塞。我可以通过更改设置队列来解决这个问题,但是我增加了成本,并没有解决问题。我不知道如何加速和优化。

我测试了快速运行的管道API。问题是管道API立即启动并执行任务。

我想使用在后台运行的任务准备一个管道,并在指定时间内执行战斗并模拟它。只是不知道如何使用GAE和任务来编写它。

有没有人有类似的问题?

请帮帮我。谢谢。

1 个答案:

答案 0 :(得分:0)

您是否无法将Pipeline API与您的Cron作业链接以延迟执行?

仅供参考,我猜管道API还在内部利用任务队列,但使用分片,切片来优化性能。