Асинхронные задачи 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.
В производстве задания будут выполняться одновременно, как и следовало ожидать.