Пассажир Phusion + Workling + RabbitMQ
-
23-08-2019 - |
Вопрос
Я пытаюсь развернуть приложение RoR, которое выполняет некоторую асинхронную задачу.Для этого я использую Workling, а очередь сообщений — RabbitMQ.Эта комбинация работала безупречно со Старлингом, но мы решили изменить MQ на Кролика.Я где-то читал, что мне следует включить следующий код в свой файл Environment.rb.
require 'mq'
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked
if EM.reactor_running?
EM.stop_event_loop
EM.release_machine
EM.instance_variable_set( '@reactor_running', false )
end
Thread.current[:mq] = nil
AMQP.instance_variable_set('@conn', nil)
end
th = Thread.current
Thread.new{
AMQP.connect(:host => 'localhost'){
th.wakeup
}
}
Thread.stop
end
end
Но теперь Apache полностью терпит неудачу с сообщением:На сервере произошла внутренняя ошибка или неправильная конфигурация, и он не смог выполнить ваш запрос.
Решение
РЕДАКТИРОВАТЬ:После публикации я несколько улучшил приведенный ниже код.Доступна здесь: http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html
Я потратил миллион лет, пытаясь заставить это работать, и наконец сделал это.Вот мой код:
require 'amqp'
module HiringThingEM
def self.start
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked && EM.reactor_running?
EM.stop
end
Thread.new {
EM.run do
AMQP.channel ||= AMQP::Channel.new(AMQP.connect(:host=> Q_SERVER, :user=> Q_USER, :pass => Q_PASS, :vhost => Q_VHOST ))
end
}
die_gracefully_on_signal
end
end
end
def self.die_gracefully_on_signal
Signal.trap("INT") { EM.stop }
Signal.trap("TERM") { EM.stop }
end
end
HiringThingEM.start
Теперь я могу использовать:
EM.next_tick { AMQP.channel.queue(Q_Q).publish("hi mom") }
Внутри контроллеров моего приложения Rails.
Надеюсь, это кому-то поможет.
Другие советы
Не совсем ответ, но если вы не привержены AMQP, я бы рекомендовал использовать https://github.com/defunkt/resque - он очень хорошо выполняет асинхронную работу + разветвление.