Google App Engine计票

时间:2014-10-06 20:52:18

标签: google-app-engine google-cloud-datastore app-engine-ndb

我有一个App Engine Python应用程序,其中玩家发布他们对问题的回答,并且一组评委将他们投票给对错。使用此模型的法官投票:

class vote(ndb.Model):
   judge = ndb.KeyProperty(justice)
   value = ndb.BooleanProperty()
   timestamp = ndb.DateTimeProperty(auto_now_add = True)
   question = ndb.KeyProperty(game_has_question_has_player)

问题有这个结构:

class game_has_question_has_player(ndb.Model):
   match = ndb.KeyProperty(game)
   challenge = ndb.KeyProperty(questionList)
   gamer = ndb.KeyProperty(player)
   answer = ndb.StringProperty()
   passed = ndb.BooleanProperty()

如果正面或负面投票的数量占法官的1/2 +1,则该问题被视为通过或失败。这可以在所有评委投票之前发生,并且是应用程序处理其余挑战以继续游戏的关键。

我的问题与那个时刻有关。当挑战/问题刚刚通过时,我怎么能可靠地知道?总结一下我被困的地方,这是我能看到的选项:

  • 投票方法查询先前的投票并决定(考虑投票的投票)更新“game_has_question_has_player”中的“已通过”字段。这里的问题是,计算先前投票的查询可能会给出错误的答案,因为其他评委同时投票,其他投票也同时执行。

  • 我更改了'问题'模型,为投票添加了一个计数器。我在那里看到一个争论问题,因为法官同时被告知投票的挑战,因此可以在时间上彼此投票非常接近。我可以使用交易,但我不清楚它在生产中的局限性(我现在在开发服务器中)。在某个游戏中可以很容易地有10个评委,但如果游戏占千元票数* = ~10 *问题数量*玩家数量。

  • 我使用任务队列推迟重新计数。如果每次投票都做同样的事情:我们的情况与第一点不同,只是推迟了吗?

我读过有关分片计数器的信息,但我认为它们不适合这里;投票是正确的投票,只是通过测试的“事件”,这对我来说似乎很棘手。

非常感谢任何见解或想法。

1 个答案:

答案 0 :(得分:1)

交易应该在这里工作,将来也不会成为问题。他们只是“锁定”#34;触及的实体组并且不会让您无法扩展。

你的第三点也应该有效,如果你推迟你的任务队列的推出(我会说3到5秒)。在此检查期间,数据存储区应该是最新的。

但是没有什么可以避免你一起尝试这两个解决方案,只是为了确保"确保"。