【问题标题】:persistable delayed tasks in ruby on railsruby on rails 中的可持久延迟任务
【发布时间】:2013-12-19 15:42:12
【问题描述】:

我正在运行一个 ruby​​ on rails 应用程序,并且作为某个进程的一部分,如果发生特定情况,我需要在某个操作的 10 分钟后向用户发送邮件。

我看到一个叫做 rufus 的 gem 可以用来实现这个 (https://github.com/jmettraux/rufus-scheduler/blob/two/README.rdoc),看起来很棒,只需执行以下操作:

scheduler.in '3s' 做 放“你好……鲁弗斯” 结束

据我了解,它在后台进程内内存线程中运行,并在所需时间触发 proc。 但是,据我了解,这不是持久的,这给我们带来了一个大问题,因为我们不断地部署,部署会杀死现有的进程,从而杀死线程和发生所需的动作。

有人可以为此提出一个可行的方法,也许是另一个支持持久性的框架,或者可能使用现有的 gem 并进行一些调整?

非常感谢, 亚历克斯

【问题讨论】:

    标签: ruby-on-rails ruby background task scheduling


    【解决方案1】:

    使用sidekiq,它基本上是一个作业队列并将作业持久化到 Redis 数据库中,还有一个不错的 Web 界面,重试等等。

    要运行计划作业,请查看https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs

    YourAfterJobWorker.perform_in 10.minutes, user.id
    

    你的 worker 的实现看起来像

    # app/workers/your_after_job_worker.rb
    class YourAfterJobWorker
      include Sidekiq::Worker
    
      def perform(user_id)
        user = User.find(user_id)
        TheAfterJobMailer.some_email(user).deliver if user.matches_your_condition?
      end
    end
    

    【讨论】:

      【解决方案2】:

      如果您不想要另一个操作依赖项(Sidekiq 需要 Redis),总有 DelayedJob 可以与您的 SQL 环境中的新表一起使用(它们现在也是 support other backends),尽管效率低于 Sidekiq/Redis。

      语法与 Sidekiq 和其他 ActiveJob 实现几乎相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 2013-03-05
        • 1970-01-01
        • 2020-09-03
        • 2017-11-09
        • 1970-01-01
        相关资源
        最近更新 更多