使用Redis,Sidekiq,Heroku和Rails了解后台工作者5

时间:2019-01-08 17:41:22

标签: ruby-on-rails heroku redis sidekiq

我有一个Rails 5应用程序,在这里我开始使用Sidekiq,Heroku和Redis将各种作业移到后台。

到目前为止,我有具有相同名称的Class的ResetFinanceDataWorker。

//reset_finance_data_worker.rb

class ResetFinanceDataWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform()
  end
end

我可以通过致电ResetFinanceDataWorker.perform_in(10.seconds)来称呼它。理想情况下,我希望在一个文件中包含多个工作程序,如下所示:

//finance_worker.rb

class AnotherWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform()
  end
end

class ResetFinanceDataWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform()
  end
end

并且能够调用FinanceWorker.AnotherWorker.perform_in(10.seconds)。但是,这是不可能的。

有人可以向我解释1)我将如何进行这项工作?和2)有关组织工作文件的最佳实践。

谢谢。

1 个答案:

答案 0 :(得分:1)

最佳做法和约定是将一个类放在具有相应文件名的文件中。工人或任何其他阶层都没有关系。如果要组织它们,可以将类似的工作程序包装在一个模块中,然后将其移动到单独的文件夹finance_worker

 module FinanceWorker  
   class AnotherWorker
   end
 end

在这种情况下,您可以致电FinanceWorker::AnotherWorker.perform_async

更新:

finance_worker内创建一个单独的文件夹app/jobs,然后将所有需要的工作程序文件移动到那里。将所有这些工作程序类包装在module FinanceWorker中。我的意思是,分开包装,仍然放在不同的文件中,仍然only one class, wrapped in module, inside the file

如果您有10名工作人员,则为他们有10个文件。但这是Sidekiq的工作人员,而不是heroku的工作人员,请不要混淆他们。要启动Sidekiq,您只需要Procfile中的一行即可:worker: bundle exec sidekiq。这条线将为Sidekiq启动1个heroku工人dyno,这将启动他的所有10个工人。没关系,这是常见的做法。如果您注意到Sidekiq的1个dyno不够,您总是可以添加更多,它们将在队列之间划分。

并且不要忘记您可以为worker指定队列名称。默认情况下,所有作业都进入常规default队列。如果您希望某个工人有自己的队列,只需将其添加到sidekiq_options

sidekiq_options retry: false, queue: 'finance'