首页 > 解决方案 > 如何通过应用引擎监控firestore并同时执行多个游戏?

问题描述

如何通过应用引擎或其他 Google 云服务同时监控 Firestore 并执行多个游戏?(由于 Cloud Functions 的 9 分钟限制,我无法使用 Cloud Functions):((

我参考官方文档写了代码来快照Firestore中的集合路径。代码示例如下:

def hello_firestore(last_match_key): 
    print('%s start!!!' % last_match_key)
    # TODO execute game. For about 13 minutes
    asyncio.run(Game_main(last_match_key).waitingForAllMatch())
    print('%s done!' % last_match_key)

# onsnapshot
def CustomizeOnSnap(col_snapshot, changes, read_time):
    for change in changes:
        if change.type.name == 'ADDED':
            last_match_key = u'{}'.format(change.document.id)
            return hello_firestore(last_match_key)
        else:
            break

if __name__ == '__main__':
    db.collection(u"PlayAndScore").on_snapshot(CustomizeOnSnap)

对于这段代码,我可以成功地使用 onsnapshot 来执行我的游戏的功能。

但是由于第一局a还在执行,结果我一次只能运行一个游戏,不能同时执行多组(第二局可以监控,但不会自动开始第二局直到第一场比赛结束)。如何解决我不能同时玩多个游戏的问题?

有人可以给我一些解决这个问题的方法吗?困扰我两个月了。

标签: firebasegoogle-app-enginegoogle-cloud-platformgoogle-cloud-firestore

解决方案


我相信您可以使用Cloud Tasks而不是 Cloud Functions。您可以同时运行多个 Cloud Tasks,如果您使用手动扩展,则可以将手动扩展的等待时间设置为最长 24 小时。

根据您的用例,另一种可行的方法是在 App Engine 上使用流量拆分。

一个可能有点远的想法是从主代码中为您想要的每个游戏生成端点。就像基本的 Flask 示例一样:

@app.route('/greeting/<name>')
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

这样,您将为每个用户运行单独的“游戏”,如果这正是您想要实现的目标。

但是,根据您对用例的描述,我会选择 Cloud Tasks。


推荐阅读