让Rails在某个时间发生一些事情

时间:2009-01-30 13:19:37

标签: ruby-on-rails asynchronous backgroundworker

与浏览器游戏一样。用户构建建筑物,并为特定日期/时间设置计时器以完成构造并生成建筑物。

我想象有一个类似deamon的东西,但它会如何工作?对我而言,旋转+投票似乎不是可行的方法。我看了async_observer,但是这样适合这样的事情吗?

4 个答案:

答案 0 :(得分:1)

如果您只需要让所有玩家看到该事件,那么该模型可以按需报告其更新状态,我们已经完成,继续前进,这里没有什么可看的。

另一方面,如果从计划创建之时起,任何人都可以看到它,那么这个问题会更有趣。

我说你需要两件事。一个队列,您可以在其中放置定时事件(数据库表可以很好地执行)和后台进程,无论是连续运行还是经常重新启动,都会拉出自上次执行以来计划发生的事件(或者我认为即将发生的事件)和采取行动。

查看Rails wiki上的list of options,似乎还没有One True Solution。让我们希望其中一个适合这个法案。

答案 1 :(得分:1)

我刚刚为我正在制作的PBBG做了这件事(Big Villain,你可以在MadGamesLab.com上看到正在进行的工作)。无论如何,我选择了一个命令表,其中每个用户命令只生成一个条目和一个事件表,每个命令有一个或多个条目(链接回命令)。使用脚本/运行器运行的辅助守护程序启动它以定期轮询事件表并运行时间已过的事件。

到目前为止它似乎工作得很好,除非我在向其投入大量用户时看到一些问题,我不打算改变它。

答案 2 :(得分:0)

在某种程度上,它取决于您的前端有多少逻辑,以及您的模型中有多少逻辑。如果您知道在事情发生之前会花多少时间,那么您可以将大部分逻辑保留在前端。

我会使用你的模型来确定事物的状态,并且在特定的请求中你可以检查它是否被构建。我不明白为什么你需要一个后台工作者。

答案 3 :(得分:0)

我会使用AJAX来启动计时器(请参阅Periodical Executor)以更新您的UI。在模型方面,只需跟踪建筑物的created_at列,只允许在建筑时间结束时使用它。这样你就不必每隔几秒就去一次你的数据库,看看你的建筑是否已经完成。