我有一个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)有关组织工作文件的最佳实践。
谢谢。
答案 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'