【问题标题】:Timed server events with ruby on rails使用 ruby​​ on rails 的定时服务器事件
【发布时间】:2010-12-29 22:19:38
【问题描述】:

我正在尝试在 Ruby on Rails 中创建一个基于 Web 的游戏。我有一个名为“Game”的模型,它在数据库条目中有一个日期时间,对应于我希望服务器调用 Game 模型的 update_game 函数的时间。根据游戏的设置,这可能是每 30 秒到每 12 小时一次。

Ruby on Rails 似乎只有在收到 HTTP 请求时才能工作;有没有一种巧妙的方法可以让我的游戏独立于 HTTP 请求定期更新?

【问题讨论】:

    标签: ruby-on-rails ruby daemon background-process


    【解决方案1】:

    我会为此调查delayed_job。当游戏开始时,你可以为第一次更新创建一个delayed_job,之后的每次运行都可以以正确的间隔添加一个新的工作,直到它完成。

    不过,我会进行大量测试 ;) - 你不想让工作远离你。

    【讨论】:

      【解决方案2】:

      Rails 本身不这样做; cron 这样做。然而,Ruby 确实有 a gem named Whenever 来简化新 cron 作业的声明和部署。

      但是,如果您真的希望大量游戏能够每 30 秒可靠地更新一次,那么如果更新游戏会花费大量时间,您可能需要采用不同的方法。也许一旦访问游戏,游戏可以根据需要多次运行更新(例如,如果 3 分钟过去了,间隔为 30 秒,则在请求后运行 6 次更新)。但是,这对于您的设置可能是一个好选择,也可能不是一个好选择,因此请确定哪种方法更适合您的目的。

      【讨论】:

      • 每次访问游戏时更新的困难在于游戏将更新子对象和孙对象。我必须在游戏的每个后代中放置类似的代码,如果我添加孙子,似乎很容易引入错误,但忘记放入 before_filter 以在游戏被访问时更新游戏。
      • 所以它不止一个控制器?那么我认为 cron 绝对是更好的解决方案。任何时候都是一个很棒的工具:)
      • 如果您担心忘记“before_filter”,那么为什么不创建一个继承自 ActionController 的类,包含它所需的所有设置和方法,然后让所有控制器继承从那?
      【解决方案3】:

      查看后台处理选项,可能还有 cron。

      【讨论】:

        【解决方案4】:

        我喜欢在 Rails 中工作的 gem 'rufus-scheduler',但我不确定你是否可以通过编程方式向它添加更多任务。

        【讨论】:

          猜你喜欢
          • 2011-03-11
          • 1970-01-01
          • 2020-06-04
          • 2014-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-31
          • 2018-04-18
          相关资源
          最近更新 更多