티스토리 뷰

Web 프로그래밍/Redis

[Redis] Pub/Sub 설명

데브업 2022. 10. 17. 21:23

PUB/SUB 설명

 

레디스를 사용하는 가장 큰 이유가 속도는 물론 아마 pub/sub 기능 때문이 아닐 까 싶다.

SUBSCRIBE, UNSUBSCRIBE, PUBLISH는 게시자/구독자의 메시지 패러다임을 구현한다.

게시된 메시지는 구독자가 무엇인지에 대한 지식없이 채널로 특징이 지어진다. 구독자(SUBSCRIBE)는 하나 이상의 채널에 관심을 표명하고 해당 게시자가 누구인지에 대해 알 필요가 없고 관심있는 메시지만 수신을 한다.

이렇게 게시자와 구독자를 분리하면 확장성이 향상되고 보다 동적인 네트워크 토폴로지가 가능해진다.

특정 채널을 구독하는 방법은 다음과 같이 아주 간단하다.

  redis > SUBSCRIBE channel [channel ...]

위와 같이 간단하게 구독이 가능하며 발행자는 다른 클라이언트가 이 채널로 메시지를 보내면 현재 구독을 하고 있는 모든 클라이언트로 푸쉬가 된다.

간단한 예제를 보자

2개의 레디스 쉘 커맨드를 띄운다.

좌측 커맨드(SUBSCRIBE)
우측 커맨드(PUBLISH)

좌측 커맨드는 간단하게 test1과 test2의 채널을 구독하겠다고 명시를 하였다.
우측 커맨드는 아무런 활동을 하지 않았다.

우측 커맨드(발행자)에서 구독한 클라이언트에게 메시지를 보내면 좌측 커맨드(구독자)들은 누가 보냈는지는 신경쓰지도 않고 자신이 구독한 채널에 메시지만 받게 된다.
test3 채널은 구독을 하지 않았으므로 수신을 받지 못하고 test1과 test2채널은 구독을 하여 수신을 받는다.

하나 이상의 채널에 가입한 클라이언트(좌측커맨드)는 다른 채널을 구독하고 탈퇴 할 수 있지만 구독중에는 명령을 보낼 수는 없다.

 

 

푸시된 메시지의 포맷 형식

모든 메시지들은 배열 형식으로 받으며 첫 번째 요소의 메시지의 종류는 3가지가 있다.

subscribe : 응답의 두 번째 요소로 된 채널에 성공적으로 가입이 되었다는 것을 의미한다. 3번째 변수는 현재 구동중인 채널을 의미

  1) "subscribe"  // 두 번째 요소(test1) 채널에 성공적으로 가입이 되었음을 의미
  2) "test1"        // 가입한 채널명
  3) (integer) 1   // 현재 구독중인 채널수

< 구독을 하였을 때 응답 형식의 간단한 형식 >

 

unsubscribe : 구독중인 채널을 탈퇴하였을 경우를 의미

  1) "unsubscribe"   // 두 번째 요소(test1)의 채널을 성공적으로 탈퇴 되었음을 의미
  2) "test1"            // 탈퇴한 채널명
  3) (integer) 0       // 현재 구독중인 채널수

< 메시지를 수신 하였을 때 응답 형식의 간단한 형식 >

 

message : 다른 클라이언트가 발행한 publish 명령의 결과로 수신된 메시지

  1) "message"   // 두 번째 요소(test1)로 특정 메시지가 수신되었음을 의미
  2) "test1"        // 가입한 채널명
  3) "hello"        // 발행된 메시지

< 메시지를 수신 하였을 때 응답 형식의 간단한 형식 >

 

 

데이터베이스 & 스코프

PUB/SUB는 키 공간과 관련이 없으며 데이터베이스 번호를 포함하여 어떤 레벨에서도 방해하지 않도록 설계되어 있다.
즉 db10번의 데이터베이스에서 발행을 하여도 db1번에서 구독자가 메시지를 수신할 수 있다.

무슨 말인지 이해가 되지 않으면 직접 해보길 바란다.

  redis > select 10
  redis > subscribe test1 test2 

 

 

 

 

패턴매칭 구독

Redis의 Pub/Sub 구현은 패턴 일치를 지원합니다. 클라이언트는 주어진 패턴과 일치하는 채널 이름으로 전송 된 모든 메시지를 수신하기 위해 glob 스타일 패턴에 가입 할 수 있습니다.

 redis > PSUBSCRIBE news.*

ex) news.sport , news.politic , news.music , news.article , news.entertainment 등등 패턴 매칭으로 한 번에 구독이 가능하다.