2

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

  1. 用户 A 向后端请求匹配。后端告诉他稍后再回来
  2. 用户 B 向后端请求匹配。他将与A相匹配。
  3. 用户 C 向后端请求匹配。后端告诉他稍后再回来
  4. 用户 D 向后端请求匹配。他将与C相匹配。
  5. 等等...

(编辑:我的假设是,如果我能弄清楚这一点,大多数其他操作 ia 回合制游戏都可以使用相同的实现)

这可以在Apple GamecenterXbox Live中很容易地完成,但是我宁愿在像 GAE 这样的开放且独立于平台的后端上实现它。经过一些研究,我发现了 GAE 实施的以下选项:

  • 使用内存缓存。但是,不能保证 memcache 在不同的实例之间是同步的。我做了一些测试,实际上可以看到由于内存缓存错误同步而导致匹配请求消失。
  • 使用分片计数器强化内存缓存。这并不总能解决多实例问题,并且 mayabe 会导致高内存缓存配额使用率。
  • 将内存缓存与比较和设置一起使用。用作互斥体时不能解决多实例问题。
  • 任务队列。我不知道如何使用这些,但有人提到作为可能的解决方案。但是,我担心排队会很快吃掉我的 GAE 配额。
  • 推队列。和上面一样。
  • 交易。和上面一样。也可能非常昂贵。
  • 渠道。和上面一样。也可能非常昂贵。

匹配是网络游戏中非常基础的操作,我不可能是第一个遇到这种情况的人。因此我的问题是:

  • 您知道任何安全的配对机制吗?
  • 如果存在多个解决方案,哪个是最便宜的(就 GAE 配额使用而言)解决方案?
4

1 回答 1

1

您可以在这样的方案中使用 cron 任务来完成此操作:

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

用户 A 请求匹配,创建一个 MatchRequest 实体,其中 A 作为请求者,对手为空白。用户 A 进行投票以查看对手字段何时被填满。用户 B 请求匹配,以 B 作为请求者创建一个 MatchRequest 实体。用户 B 池以查看对手字段何时被填满。

每 20 秒运行一次的 cron 作业?左右运行:

  1. 获取对手 == '' 的所有 MatchRequest
  2. 进行所有适当的匹配
  3. 将所有 MatchRequests 作为一个事务

现在,当 A 和 B 下次投票时,他们会看到他们有对手。

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

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

于 2013-02-06T21:38:58.853 回答