복붙노트

[REDIS] 레일 레디 스 펍 / 하위

REDIS

레일 레디 스 펍 / 하위

레디 스 팝 / 하위 다음

이 잘 작동하고 내가 사용하는 모든 클래스에 메시지를 게시 할 수 있습니다

$redis.publish 'channel', { object: @object.id }

레디 스-CLI> 모니터를 사용하여,이 요청이 제대로 게시 된 것을 확인할 수 있습니다

[0 127.0.0.1:64192] "publish" "channel" "{:object=>\"5331d541f4eec77185000003\" }"

나는 다음과 같은 다른 클래스 (리스너 클래스)에 해당 채널에 가입자 블록을 추가 할 때 문제가 시작

class OtherClass
  $redis.subscribe('channel') do |payload|
    p payload
  end
end

레디 스-CLI에> 모니터도 쇼 청취자가 올바르게 등록되어 있는지

[0 127.0.0.1:52930] "subscribe" "channel"

문제는 내가 같은 레일 응용 프로그램에 가입자 리스너 클래스를 추가 할 때 ...는 레디 스 서버에 OtherClass 듣는다 원인 작업 및 기타 코드의 실행을 중지 중지한다는 것입니다 ... 그것은 그냥 듣기에 앉아있다.

그래서 같은 레일 응용 프로그램에 레디 스와 메시징 버스를 만들 수있는 방법은 이벤트가 어떤 클래스 또는 서비스 개체에서 게시 및 특정 채널이 백그라운드에서 이벤트를 수신에 따라 행동하는 청취자가있다 그래서 ...이있다.

나는 sidekiq 또는이 작업을 수행하는 다른 배경 노동자를 사용할 수있는 알고 ...하지만 후에 배경 노동자들은 지저분하고 이상 유지할되었다있다.

해결법

  1. ==============================

    1.레디 스 # 가입의 구현은 이벤트를 수신하기 위해 현재 스레드의 제어를 가정하는 루프입니다. 이것은 당신이 보여준 방식에 레일 클래스의 컨텍스트에 가입을 삭제하면 부팅 프로세스가 중단되는 것을 의미한다.

    레디 스 # 가입의 구현은 이벤트를 수신하기 위해 현재 스레드의 제어를 가정하는 루프입니다. 이것은 당신이 보여준 방식에 레일 클래스의 컨텍스트에 가입을 삭제하면 부팅 프로세스가 중단되는 것을 의미한다.

    당신은 스레드에서 호출을 래핑 시도 할 수 있지만, 콘솔 또는 여러 유니콘 레일처럼이 방법은 말 그대로, 새 구독이 클래스는 새로운 프로세스에로드 된 각 시간을 만들 것입니다. 게다가, 당신은 공유 상태 및 기타 스레딩 문제에주의해야 할 것이다. 이것은 당신이 원하는 아마 아니다.

    당신은이 웹 요청을 처리하는 프로세스와 별도로 레디 스에 환경과 구독 레일로드하는 다른 프로세스를 시작하는 것이 가장 좋은 선택입니다. 그것은 다음과 같은 레이크 작업이 될 수 있습니다 :

    namespace :subscribe do
      task :redis => :environment do
        $redis.subscribe("bravo") do |on|
          on.message do |channel, message|
            Rails.logger.info("Broadcast on channel #{channel}: #{message}")
            OtherClass.some_method # yada yada
          end
        end
      end
    end
    
  2. from https://stackoverflow.com/questions/22644761/redis-pub-sub-on-rails by cc-by-sa and MIT license