【发布时间】:2013-02-02 17:21:16
【问题描述】:
考虑在 Google App Engine 上实现扑克。假设玩家只有 10 秒时间过牌/弃牌/加注。
也就是说,如果 10 秒后玩家没有响应,则应该触发一些计时器,该计时器将执行写入 DataStore 的代码,声明玩家弃牌。在 Google App Engine 上实现此功能的惯用方式是什么。
【问题讨论】:
考虑在 Google App Engine 上实现扑克。假设玩家只有 10 秒时间过牌/弃牌/加注。
也就是说,如果 10 秒后玩家没有响应,则应该触发一些计时器,该计时器将执行写入 DataStore 的代码,声明玩家弃牌。在 Google App Engine 上实现此功能的惯用方式是什么。
【问题讨论】:
GAE 有一个称为“任务”的功能。遗憾的是,它们没有保证的解决方案,因此计划在现在 +10 秒内执行的任务可以在 10 秒或任何以后时间执行。
解决方案:将当前时间戳连同有关当前玩家的信息一起写入数据库。如果有玩家要求更新当前游戏的信息,您可以检查此时间戳,将其与当前时间戳进行比较,从而确定这 10 秒是否已过并相应地更新数据库。
您可以将此解决方案与任务相结合,以确保即使没有人“观看”该游戏,它仍会在某个时候更新。
【讨论】:
这需要在后端完成,因为这是唯一可以在请求处理程序之外保留的代码。
后端是特殊的 App Engine 实例,它们没有请求期限、更高的内存和 CPU 限制以及跨请求的持久状态。它们由 App Engine 自动启动,可以长时间连续运行。每个后端实例都有一个用于请求的唯一 URL,您可以跨多个实例对请求进行负载平衡。
https://developers.google.com/appengine/docs/python/backends/
【讨论】:
无需同步操作 - 即在用户最后一次操作后 10 秒执行某些操作。
只需记录用户上次操作的时间,并在下次用户操作发生时采取相应措施:如果 10s 通知用户他弃牌。
为了让事情更具响应性,例如为了向用户显示他在折叠前还有多少时间,您还应该在客户端上跟踪它。
【讨论】: