【发布时间】:2012-04-03 07:17:40
【问题描述】:
我只听说过 Celery 之类的工具,但我不知道它是否符合我的需求并且是我能拥有的最佳解决方案。
想象一下像 Travian 这样的游戏。我们开始构建,我们必须等待 N 秒直到构建完成。我们应该何时以及如何完成施工?
解决方案 1: 每次页面加载时检查是否有活动构造。如果这样的查询需要一些时间,我们可以使它们异步。如果有一些 - 然后完成。
但是,通过这种方式,我们一直在等待用户重新加载页面。当然,我们可以使用 cronjob 不时检查要完成的构造,但 cronjobs 在一分钟内执行一次或更少。构造/攻击等必须尽可能精确地执行。
上述解决方案有效,但有一些缺点。有什么更好和可靠的方法来执行我提到的那些操作。
此外,让我们假设资源需要以X per hour 的速度重新生成,并且我们需要非常精确且频繁地重新生成它们。如何在不等待页面刷新的情况下实现这一点?
最后,解决方案应适用于 Webfaction 托管或任何其他共享托管。我听说 Celery 在 Webfaction 中不起作用还是我弄错了?
【问题讨论】:
-
你可以定时异步调用,同步前端状态和服务器状态,真的不用等用户刷新。只是不要经常这样做,因为它可能很昂贵。当然 - 您可能希望以不同的方式同步界面的不同部分 - 例如对实际资源量的调用应该便宜且频繁,但是在计时器说应该完成之前,构建查询可能不会刷新。
-
但是如果建筑物影响每小时的资源生产呢?比如10分钟后建造,资源产出翻倍,但玩家不刷新页面,资源产出不会翻倍。我需要非常精确地执行操作。
-
那么资源回调还应该检查是否有任何建筑物在此期间建造并逐步计算增益(到/从建筑物完成)。请注意,90% 的事件可以被延迟评估 - 您只需检索一堆未处理的事件,这些事件会影响请求的操作并以正确的顺序计算它们。当然 - 您还需要某种调度程序,它可以保护您免受事件泛滥的影响,但只要您每个请求只有几个操作 - 应该没问题。