Sidekiq异步任务是同步完成的

时间:2018-06-21 23:10:14

标签: sidekiq ruby-on-rails-5.2 ruby-2.4

我有两个Sidekiq工人:

# app/workers/client_worker.rb
class ClientWorker
  include Sidekiq::Worker

  def perform(*args)
    puts "client started\n"
  end
end

# app/workers/server_worker.rb
class ServerWorker
  include Sidekiq::Worker

  def perform(*args)
    i = 0
    loop do
      begin
        i = i + 1
        puts "server waiting"
        sleep(2)
        if i > 5
          break
        end
      rescue => e
      end
    end
  end
end

我有两个Rails应用,相同的Rails版本,相同的ruby版本,相同的gems版本。

rvm use ruby-2.4.2@rails5.2

在新的Rails应用上 当我启动服务器工作程序,然后紧接着启动客户端工作程序时,我在服务器消息中获得了预期的客户端消息:

2018-06-21T22:44:19.855Z 32364 TID-gn863tph0 ServerWorker JID-7cdd1fd3d6fe63c91d99f3b0 INFO: start
server waiting
server waiting
server waiting
2018-06-21T22:44:24.356Z 32364 TID-gn865q1zk ClientWorker JID-7dc887d6824d0b789afec69d INFO: start
client started
2018-06-21T22:44:24.357Z 32364 TID-gn865q1zk ClientWorker JID-7dc887d6824d0b789afec69d INFO: done: 0.001 sec
server waiting
server waiting
server waiting
2018-06-21T22:44:31.858Z 32364 TID-gn863tph0 ServerWorker JID-7cdd1fd3d6fe63c91d99f3b0 INFO: done: 12.003 sec

在已开发的Rails应用上

当我重复此过程时,任务依次运行:

2018-06-21T22:41:34.250Z 32247 TID-grdaosqf3 ServerWorker JID-5a2d9917e6575d6858644474 INFO: start
server waiting
server waiting
server waiting
2018-06-21T22:41:38.402Z 32247 TID-grdamch6b ClientWorker JID-5da83582991bf284f6357046 INFO: start
server waiting
server waiting
server waiting
client started
2018-06-21T22:41:46.259Z 32247 TID-grdaosqf3 ServerWorker JID-5a2d9917e6575d6858644474 INFO: done: 12.007 sec
2018-06-21T22:41:46.259Z 32247 TID-grdamch6b ClientWorker JID-5da83582991bf284f6357046 INFO: done: 7.858 sec

我尝试过的

  • 我已删除了旧应用程序中所有已安装的gem,因此旧的Rails应用程序Gemfile仿效了新的宝石。我已删除所有自定义库,所有作业,所有自定义配置
  • 我在两个应用程序中都比较了Sidekiq.options,它们是相同的:

    {:queues => [],:labels => [],:concurrency => 25,:require =>“。”,:environment => nil,:timeout => 8,:poll_interval_average => nil, :average_scheduled_poll_interval => 5,:error_handlers => [],:death_handlers => [],:lifecycle_events => {:startup => [],:quiet => [],:shutdown => [],:heartbeat => []} ,: dead_max_jobs => 10000,:dead_timeout_in_seconds => 15552000,:reloader =>#}

现在,我的想法用光了!谁能建议我一种方法找出问题所在?

编辑 Okey,经过长时间的犹豫,我决定对旧应用程序中的新应用程序进行相同的更改,即:在新应用程序中,我指出不自动包含工作程序,因此添加了以下初始化程序:

# config/initializers/01_extensions.rb
Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }

在旧的应用程序中,自动包含了工作程序(我真的不知道这是默认行为!),因此不需要此初始化程序。

立即开始,当我决定向旧应用添加相同的初始化程序时,任务将按预期方式异步运行。

现在我有两个问题:

  • 我们是否需要明确包括sidekiq工人? (文档中未提及)
  • 工人的明确包括在附带行为方面没有改变吗?

1 个答案:

答案 0 :(得分:2)

在开发中,Rails 5有效地将您一次限制在一项工作,即使有多个线程也是如此。此全局“执行者”锁允许重新加载Rails闻名的开发。

在生产中,作业将按照您的期望并发执行。