[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.레디 스 # 가입의 구현은 이벤트를 수신하기 위해 현재 스레드의 제어를 가정하는 루프입니다. 이것은 당신이 보여준 방식에 레일 클래스의 컨텍스트에 가입을 삭제하면 부팅 프로세스가 중단되는 것을 의미한다.
레디 스 # 가입의 구현은 이벤트를 수신하기 위해 현재 스레드의 제어를 가정하는 루프입니다. 이것은 당신이 보여준 방식에 레일 클래스의 컨텍스트에 가입을 삭제하면 부팅 프로세스가 중단되는 것을 의미한다.
당신은 스레드에서 호출을 래핑 시도 할 수 있지만, 콘솔 또는 여러 유니콘 레일처럼이 방법은 말 그대로, 새 구독이 클래스는 새로운 프로세스에로드 된 각 시간을 만들 것입니다. 게다가, 당신은 공유 상태 및 기타 스레딩 문제에주의해야 할 것이다. 이것은 당신이 원하는 아마 아니다.
당신은이 웹 요청을 처리하는 프로세스와 별도로 레디 스에 환경과 구독 레일로드하는 다른 프로세스를 시작하는 것이 가장 좋은 선택입니다. 그것은 다음과 같은 레이크 작업이 될 수 있습니다 :
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
from https://stackoverflow.com/questions/22644761/redis-pub-sub-on-rails by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] ELK 스택 레디 스의 점은 무엇인가? (0) | 2020.01.05 |
---|---|
[REDIS] 잠금 및 레디 스 (0) | 2020.01.05 |
[REDIS] (클라이언트 측) 자바 스크립트와 레디 스에 직접 연결? (0) | 2020.01.05 |
[REDIS] 레디 스에서 제한 목록 길이 (0) | 2020.01.05 |
[REDIS] 레디 스 바인드 한 개 이상의 IP에 (0) | 2020.01.05 |