我使用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和任务来编写它。
有没有人有类似的问题?
请帮帮我。谢谢。
答案 0 :(得分:0)
您是否无法将Pipeline API与您的Cron作业链接以延迟执行?
仅供参考,我猜管道API还在内部利用任务队列,但使用分片,切片来优化性能。