0

我有一个应用程序引擎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

交易应该在这里工作,将来不会成为问题。他们只是“锁定”被触摸的实体组,并且不会避免你缩放。

你的第三点也应该工作,如果你延迟推出你taskqueues足够(我会说3至5秒)。数据存储在检查过程中应该是最新的。

但是没有什么能够避免你一起尝试这两种解决方案,只是为了“确定”。

+0

非常感谢。我认为我会首先处理这个任务难题,因为它并不意味着争用,因此可能更“经济” – 2014-10-07 15:12:20