Асинхронные задачи Sidekiq выполняются синхронно

У меня есть два работника 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

Что я пробовал

  • Я удалил все установленные гемы в старом приложении, так что старое приложение Rails Gemfile напоминает новое. Я удалил все пользовательские библиотеки, все задания, все пользовательские конфигурации
  • Я сравнил Sidekiq.options в обоих приложениях они одинаковы:

    {: queues => [],: label =>[],: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=>#}

Теперь у меня заканчиваются идеи! Может кто-нибудь предложить мне метод, чтобы узнать, что не так?

РЕДАКТИРОВАТЬ Окей, после долгих колебаний я решил сделать то же самое изменение, которое я сделал в новом приложении в старом приложении, а именно: в новом приложении я заметил, что рабочие не включаются автоматически, поэтому я добавил следующий инициализатор:

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

В старом приложении рабочие включались автоматически (я действительно не знаю, какое поведение по умолчанию!), Поэтому этот инициализатор не был необходим.

НО СЕЙЧАС, когда я решил добавить тот же инициализатор в старое приложение, задачи выполняются асинхронно, как и ожидалось.

Теперь у меня есть два вопроса:

  • нужно ли явно включать работников sidekiq? (не упоминается в документе)
  • Что делает явное изменение рабочих в поведении sidekiq?

1 ответ

В процессе разработки Rails 5 эффективно ограничивает вас одной работой за раз, даже с несколькими потоками. Эта глобальная блокировка "executor" позволяет перезагружать разработку, которой славится Rails.

В производстве задания будут выполняться одновременно, как и следовало ожидать.

Другие вопросы по тегам