【问题标题】:Google App Engine - Cron or Task Queue?Google App Engine - Cron 还是任务队列?
【发布时间】:2012-03-25 11:03:00
【问题描述】:

我正在使用 Goole App Engine 构建一个简单的“与随机对手对战”后端。到目前为止,我正在将每个想要玩的用户添加到数据存储区中的“表”中。只要数据存储区中有超过 1 个玩家,我就可以开始匹配他们。

Schedule Tasks with Cron 看起来很适合这项工作,直到我看到最低分辨率似乎是微小的。如果有很多玩家注册,我希望他们能够快速匹配,而不必等待一整分钟(最坏的情况)。

我曾想过让 servlet 接收“与随机对手对战”请求 POST 到一个任务队列,以进行匹配,但我认为这会在从数据存储区读取数据并删除匹配后“随机”表中的实体?

基本上我想要一个单独的工人来进行匹配,并且我想不时向这个工人发出信号,现在是尝试匹配对手的好时机。

对这里的正确做法有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    您可以通过交易保证独占访问:

    1. 通过 REST 接收播放请求。检查(在事务中)数据库中是否有任何请求。

    2. 如果有,通知两个用户从数据库开始播放和删除请求(事务性)。

    3. 如果没有,则将其添加到数据库中并等待下一个请求。

    更新:

    您也可以通过pull queue 实现您所需要的。与上面相同的场景,只是检查拉取队列中是否有任务而不是数据存储,如果有则检索,如果没有则创建一个新的。

    【讨论】:

    • 是的,但是由于流量很大,这可能会导致很多争用。我看不出我需要不止一个“工人”来进行实际匹配。我不知道是否可以在不使用 Cron 作业的情况下创建单个工人。 Cron 的分辨率有问题,但我没有尝试将其设置为“0.1 分钟”
    • 主要问题 - GAE 中没有“工人”(如在线程运行和执行分配给它的任务中)。您可以获得的最接近的是任务队列。在你的情况下拉队列。查看更新的答案。
    • 您也可以在这里使用后端 - 但不必争用,只要每个待处理的游戏请求都在其自己的实体组中。
    • @PeterKnego 当您写下该答案时,您是否考虑过高复制数据存储?因为似乎无法为任何等待播放的实体(不是祖先查询)签入事务......我正在尝试做与 OP 相同的事情,但在设计这个时遇到了困难
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多