Я пытаюсь использовать sidekiq для обработки некоторых запросов в фоновом режиме (он интегрирован с каркасом padrino).perform_async не работает в sidekiq
Мое предположение состояло в том, что как только рабочий получил вызов, обработчик запроса немедленно вернет ответ пользователю.
Для того, чтобы быть уверенным, что он работал правильно, я применил работника, который будет печатать сообщения и спать в течение примерно 44 секунд до завершения его обработки (для имитации длительной обработки в фоновом режиме).
Для моего удивления запрос застрял, пока рабочий не закончил работу. Только после этого обработчик запроса может вернуть ответ пользователю.
Сначала я думал, что проблема сна может быть проблемой, поэтому я заменил функцию ожидания на занятую, но у меня такое же поведение: обработчик запроса повесился, пока рабочий не закончил свою задачу.
Любая идея, почему это происходит?
Вы можете увидеть следующее:
запрос обработчика:
get :hardworker, map: '/hardworker' do
logger.info "I'll call HardWorker"
HardWorker.perform_async(44)
logger.info "HardWorker was called"
return "The job should still be running in background."
end
Sidekiq работника:
class HardWorker
include Sidekiq::Worker
def perform(count)
logger.info "Doing hard work"
Sidekiq.redis { |c| logger.info "redis location: [#{c.client.location }]" }
redis_info = Sidekiq.redis { |conn| conn.info }
logger.info "connected clients: [#{redis_info['connected_clients']}]"
sleep count
logger.info "hard work was done"
end
end
Сервер Redis работает:
ps -ef | grep redis
возвращается
redis 1232 1 0 16:54 ? 00:00:09 /usr/bin/redis-server 127.0.0.1:6379
, а также sidekiq сервер:
bundle exec sidekiq -r ./config/boot.rb -v
2015-06-06T20:31:26.207Z 3343 TID-8614g INFO: Booting Sidekiq 3.3.4 with redis options {:url=>"redis://127.0.0.1:6379/0", :concurrency=>25}
Кроме того, из журналов я ставлю в рабочих мы можем видеть, что клиент по-видимому, связан с Redis:
INFO - redis location: [127.0.0.1:6379]
INFO - connected clients: [3]
sidekiq версии: 3.3.4 redis сервер: 2.8.4 рубин: 2.1.2p95
Примечание. Я установил веб-инструмент sidekiq на моем падрине, и он показывает 0 для всех характеристик (обработанных, неудачных, занятых, завершенных, повторных, запланированных, мертвых) и до и после того, как рабочий выполнил.
Пример проекта можно скачать здесь: https://github.com/plicatibu/sidekiq-problem.git
Hi. Как я писал, я заменил сон на это: i = 0; в то время как (i <4000000000) i = i + 1, конец для имитации задачи занимает много времени), и у меня был тот же результат. –
Это очень странно, я не могу воспроизвести. Есть ли репо такого поведения, с которым вы могли бы поделиться? – Anthony
Я отправлю базовый проект git и поделись его URL здесь. –