Можно ли создать в Rails тему подписки на канал сообщений Redis?
Я пытаюсь создать поток в Rails, чтобы подписаться на канал сообщений Redis. Есть ли способ сделать это? Я использую единорога.
Я попытался сделать это в конфигурации единорога, как это:
after_fork do |server, worker|
Thread.new do
begin
$redis.subscribe(:one, :two) do |on|
on.subscribe do |channel, subscriptions|
puts "Subscribed to ##{channel} (#{subscriptions} subscriptions)"
end
on.message do |channel, message|
puts "##{channel}: #{message}"
$redis.unsubscribe if message == "exit"
end
on.unsubscribe do |channel, subscriptions|
puts "Unsubscribed from ##{channel} (#{subscriptions} subscriptions)"
end
end
rescue Redis::BaseConnectionError => error
puts "#{error}, retrying in 1s"
sleep 1
retry
end
end
end
Но это сделает сервер единорога неспособным обработать любой веб-запрос. Я думал, что если я использую другой поток для подписки на Redis, он не будет блокировать основной поток; я что-то здесь упускаю?
1 ответ
Решение
Проблема здесь в GIL в рубине; и клиентская библиотека Redis ruby использует цикл для команды подписки.