App Engine上基于回合制访问的最佳实现?

时间:2013-02-03 14:55:40

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

我正在尝试使用GAE后端实现一个2人回合制游戏。这个游戏需要的第一件事是一个非常简单的匹配制作系统,其运作方式如下:

  1. 用户A要求后端进行匹配。后端告诉他稍后回来
  2. 用户B要求后端进行匹配。他将与A匹配。
  3. 用户C要求后端进行匹配。后端告诉他稍后回来
  4. 用户D要求后端进行匹配。他将与C匹配。
  5. 等......
  6. (编辑:我的假设是,如果我能想出这个,大多数其他操作我基于回合的游戏可以使用相同的实现)

    这可以在Apple GamecenterXbox Live中轻松完成,但我宁愿在开放且独立于平台的后端(如GAE)上实现此功能。经过一些研究,我发现了GAE实现的以下选项:

    • 使用memcache。但是,无法保证内存缓存在不同实例之间同步。我做了一些测试,实际上看到匹配请求因memcache错误同步而消失。
    • 使用Sharding Counters强化内存缓存。这并不总能解决多实例问题,并且可能导致高memcache配额使用。
    • 将memcache与Compare和Set一起使用。用作互斥锁时不解决多实例问题。
    • 任务队列。我不知道如何使用这些,但有人提到可能的解决方案。但是,我担心队列会很快吃掉我的GAE配额。
    • 推送队列。与上述相同。
    • 交易。与上述相同。也可能非常昂贵。
    • 信道。与上述相同。也可能非常昂贵。

    鉴于比赛制作是网络游戏中非常基本的操作,我不能成为第一个遇到这种情况的人。因此我的问题是:

    • 您知道匹配制作的安全机制吗?
    • 如果存在多种解决方案,即最便宜(就GAE配额使用而言)解决方案?

1 个答案:

答案 0 :(得分:1)

您可以使用以下方案中的cron任务来完成此任务:

define MatchRequest:
    requestor = db.StringProperty()
    opponent = db.StringProperty(default = '')

用户A要求匹配,创建MatchRequest实体,其中A作为请求者,对手为空。 用户A轮询以查看对手场的填充时间。 用户B请求匹配,创建MatchRequest实体,其中B作为请求者。 用户B池以查看对手场的填充时间。

每20秒运行一次的cron作业?或者运行:

  1. 抓住所有MatchRequest,其中对手==''
  2. 进行所有适当的比赛
  3. 将所有MatchRequests作为交易
  4. 现在当A和B接下来进行投票时,他们会看到他们有对手。

    根据GAE docs on crons免费应用程序最多可以有20个免费的cron任务。对于少量用户而言,这些crons所需的计算量应该很小。

    这将是安全方式,但我不确定它是否是最便宜方式。它也很容易实现。