2015-06-06 4 views
2

Я пытаюсь использовать 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

+0

Hi. Как я писал, я заменил сон на это: i = 0; в то время как (i <4000000000) i = i + 1, конец для имитации задачи занимает много времени), и у меня был тот же результат. –

+0

Это очень странно, я не могу воспроизвести. Есть ли репо такого поведения, с которым вы могли бы поделиться? – Anthony

+0

Я отправлю базовый проект git и поделись его URL здесь. –

ответ

4

Ну я нашел вашу ошибку, в файле boot.rb у вас есть эта строка:

require 'sidekiq/testing/inline' if RACK_ENV == 'development' 

Этот бит кода, использует рамки тестирования Sidekiq, который обходит redis и запускает его почти так, как если бы это был класс ruby ​​(т.е. он никогда не попадает в очередь на redis). Удалите эту строку и используйте ее только в своем тестовом наборе (если вам это нужно).

Вам также потребуется удалить этот файл pid из вашего YML-файла, вам это не нужно, и если вы это сделаете, это, вероятно, только для производства. Мои 2центы - удалите его.

После того, как вы сделаете это, вы хорошо идти:

Вот ваш rackup с запросом добраться до/hardworker:

[2015-06-07 07:54:25] INFO WEBrick 1.3.1 
[2015-06-07 07:54:25] INFO ruby 2.2.2 (2015-04-13) [x86_64-darwin14] 
[2015-06-07 07:54:25] INFO WEBrick::HTTPServer#start: pid=74128 port=9292 
    INFO - I'll call HardWorker 
    INFO - HardWorker was called 
    DEBUG -  GET (0.0131s) /hardworker - 200 OK 
::1 - - [07/Jun/2015:07:55:32 -0400] "GET /hardworker HTTP/1.1" 200 46 0.0291 

Вот sidekiq обработка, что работа в фоновом режиме:

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 
      ss 
    sss sss   ss 
    s sss s ssss sss ____ _  _  _ _ 
    s  sssss ssss /___|(_) __| | ___| | _(_) __ _ 
    s   sss   \___ \| |/ _` |/ _ \ |//|/ _` | 
    s sssss s    ___) | | (_| | __/ <| | (_| | 
    ss s s   |____/|_|\__,_|\___|_|\_\_|\__, | 
    s  s s           |_| 
      s s 
     sss 
     sss 

    INFO - Running in ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14] 
    INFO - See LICENSE and the LGPL-3.0 for licensing details. 
    INFO - Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org/pro 
    INFO - Starting processing, hit Ctrl-C to stop 
    DEBUG - 
    INFO - 
    INFO - Doing hard work 
    INFO - redis location: [127.0.0.1:6379] 
    INFO - connected clients: [3] 
    INFO - hard work was done 
    INFO - 
+1

Человек, вы спасли мой день! Это устранило мою проблему. Спасибо. –

Смежные вопросы