Можно ли создать в 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 ​​использует цикл для команды подписки.

Другие вопросы по тегам