【问题标题】:How to implement timer callback on Google App Engine如何在 Google App Engine 上实现定时器回调
【发布时间】:2013-02-02 17:21:16
【问题描述】:

考虑在 Google App Engine 上实现扑克。假设玩家只有 10 秒时间过牌/弃牌/加注。

也就是说,如果 10 秒后玩家没有响应,则应该触发一些计时器,该计时器将执行写入 DataStore 的代码,声明玩家弃牌。在 Google App Engine 上实现此功能的惯用方式是什么。

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    GAE 有一个称为“任务”的功能。遗憾的是,它们没有保证的解决方案,因此计划在现在 +10 秒内执行的任务可以在 10 秒或任何以后时间执行。

    解决方案:将当前时间戳连同有关当前玩家的信息一起写入数据库。如果有玩家要求更新当前游戏的信息,您可以检查此时间戳,将其与当前时间戳进行比较,从而确定这 10 秒是否已过并相应地更新数据库。

    您可以将此解决方案与任务相结合,以确保即使没有人“观看”该游戏,它仍会在某个时候更新。

    【讨论】:

    • 我很喜欢这样,除非有人来检查游戏结果,否则您不会耗尽数据存储资源。我喜欢后端版本的原因是它全部“在内存中”,数据存储仅用作定期备份。
    • 但后端无法扩展。它适用于 10 个并发游戏、100 个,甚至可能 1000 个。绝对不适用于 +10.000。然后,您必须在多个后端手动分配该负载(并发后端实例的最大数量是有限的!)并最终重新实现 appengine 旨在为您处理的内容......
    • 后端是有目的的。如果您可以准确计算资源使用情况,则可以确保扩展不是问题,因为您永远不需要使用更多资源,那么一个后端就可以提供。如果你这样做了,那么你可以开始另一个。您可以允许前端实例根据需要向上和向下扩展。如果它达到需要多个后端的地步,那么这只是另一个需要解决的问题。并且不要忘记 1000 个并发游戏可以在一个后端运行 500 个,在另一个后端运行 500 个,只要您可以将特定游戏绑定到特定服务器。
    【解决方案2】:

    这需要在后端完成,因为这是唯一可以在请求处理程序之外保留的代码。

    • 玩家被处理。计时器在后端启动。定时器到期。播放器 状态已更新。

    后端是特殊的 App Engine 实例,它们没有请求期限、更高的内存和 CPU 限制以及跨请求的持久状态。它们由 App Engine 自动启动,可以长时间连续运行。每个后端实例都有一个用于请求的唯一 URL,您可以跨多个实例对请求进行负载平衡。

    https://developers.google.com/appengine/docs/python/backends/

    【讨论】:

    • 所以你肯定没有办法做到无国籍状态?
    • 哦,我敢肯定会有办法,但是当这就是后端的用途时,为什么还要麻烦呢。例如,您可以有一个任务每秒检查数据存储中是否有过期的轮次,然后调用自身再次检查,但当然这会消耗大量资源,只是一遍又一遍地检查。也许其他人会有一个不会受到这些问题困扰的无状态版本。 Memcache 对此并不可靠。
    • 您链接到的文档说 App Engine 可能会关闭后端或可能发生意外情况。如何处理停机?如何以容错的方式使用后端?
    • 这取决于您自己构建。您通常会在此之前收到一些警告,以便您可以触发“将所有内容保存到数据存储”例程,或者您经常坚持到数据存储。事实是,任何地方都无法实现 100% 的正常运行时间,因此在 GAE 或任何其他平台上构建应用程序时必须考虑到这一点。
    • 你可以,我想,使用任务 - 在 10 秒内启动一个任务,如果到那时没有更新,那将关闭手,但我怀疑任务会以准确度(亚秒)运行这里需要。
    【解决方案3】:

    无需同步操作 - 即在用户最后一次操作后 10 秒执行某些操作。

    只需记录用户上次操作的时间,并在下次用户操作发生时采取相应措施:如果 10s 通知用户他弃牌。

    为了让事情更具响应性,例如为了向用户显示他在折叠前还有多少时间,您还应该在客户端上跟踪它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2013-01-15
      • 2017-06-12
      • 2012-05-30
      • 2011-10-22
      • 2018-07-06
      相关资源
      最近更新 更多