Использование HTTP-запроса Eventmachine в рабочем процессе Sidekiq

Допустим, у меня есть процесс sidekiq, который отправляет HTTP-запрос на публикацию, который я не хочу ждать. Я не хочу, чтобы это блокировало скорость рабочих.

У меня есть идея использовать этот простой пример кода для Http-запроса EventMachine.

  EventMachine.run do
    http = EventMachine::HttpRequest.new("http://www.example.com").post :options => {...}
    http.callback do
      puts "got a response"
      puts http.response
      EventMachine.stop
    end
    puts "worker finished"
  end

поэтому давайте предположим, что мой рабочий процесс завершается до вызова обратного вызова. Что здесь произойдет? означает ли это, что указатель на обратный вызов не работает? Я хотел бы понять поток управления здесь.


person Derek Organ    schedule 13.11.2012    source источник


Ответы (2)


В зависимости от того, что вам нужно:

  1. Вы хотите использовать ЦП
    Работники Sidekiq очень легковесны. Вы можете запустить больше из них, чтобы использовать ЦП во время ожидания ответа.
  2. Вы хотите, чтобы рабочие процессы заканчивали работу быстрее.
    Вы можете поставить каждый запрос в очередь, чтобы его обрабатывал другой рабочий процесс. Это будет похоже на next_tick() в EM. Я в восторге от Sidekiq и Celluloid, потому что они меняют наше мышление. http://www.slideshare.net/KyleDrake/hybrid-concurrency-patterns?utm_source=rubyweekly&utm_medium=email
person Sergii Mostovyi    schedule 14.11.2012
comment
Спасибо, мне тоже нравится sidekiq, но я сталкиваюсь с проблемами, когда рабочие умирают без ошибок. Я думаю, что это может быть связано с небезопасным кодом, но на первый взгляд все в порядке. - person Derek Organ; 05.12.2012

Блок EventMachine.run не вернется, пока вы не вызовете EventMachine.stop. Итак, в вашем случае рабочий не завершится без запуска обратного вызова.

person Renato Zannon    schedule 13.11.2012
comment
Итак, есть ли способ, которым я могу это сделать, что позволит рабочему завершить и по-прежнему асинхронно отправлять http-запрос. - person Derek Organ; 13.11.2012
comment
Это будет поведение вашего примера, просто он выведет завершенный рабочий процесс до того, как он завершится, потому что ваш puts находится внутри блока run. - person Renato Zannon; 13.11.2012