我有一个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 *问题数量*玩家数量。
我使用任务队列推迟重新计数。如果每次投票都做同样的事情:我们的情况与第一点不同,只是推迟了吗?
我读过有关分片计数器的信息,但我认为它们不适合这里;投票是正确的投票,只是通过测试的“事件”,这对我来说似乎很棘手。
非常感谢任何见解或想法。
答案 0 :(得分:1)
交易应该在这里工作,将来也不会成为问题。他们只是“锁定”#34;触及的实体组并且不会让您无法扩展。
你的第三点也应该有效,如果你推迟你的任务队列的推出(我会说3到5秒)。在此检查期间,数据存储区应该是最新的。
但是没有什么可以避免你一起尝试这两个解决方案,只是为了确保"确保"。