본문 바로가기

개발자를 위한 레디스

[개발자를 위한 레디스] 레디스의 Pub/Sub

 

1) 레디스의 Pub/Sub이란?

- 레디스는 아주 가벼운 pub/sub 기능을 제공한다.

  레디스 노드에 접근할 수 있는 모든 클라이언트는 발행자와 구독자가 될 수 있다. 

  발행자는 특정 채널에 메시지를 보낼 수 있으며, 

  구독자는 특정 채널을 리스닝하다가 메시지를 읽어갈 수 있다. 

 

-  레디스에서 pub/sub은 매우 가볍기 때문에 최소한의 메시지 전달 기능만 제공한다.

   발행자는 메시지를 채널로 보낼 수 있을 뿐, 

   어떤 구독자가 메시지를 읽어가는지, 정상적으로 모든 구독자에게 메시지가 전달됐는지

   확인할 수 없다.

 

- 구독자 또한 메시지를 받을 수 있지만,

  해당 메시지가 언제 어떤 발행자에 의해 생성됐는지 등의 메타데이터는 알 수 없다. 

 

- 한 번 전파된 데이터는 레디스에 저장되지 않으며, 

  단순한 메시지의 통로 역할만 한다. 

  만약 특정 구독자에 장애가 생겨 메시지를 받지 못했다 하더라도

  그 사실을 알 수 없기 때문에 정합성이 중요한 데이터를 전달하기에는 적합하지 않을 수 있다

  이럴 경우, 애플리케이션 레벨에서 메시지의 송수신과 관련한 로직을 추가해야 할 수 있다. 

 

2) 메시지 Publish 하기

- 레디스에서는 PUBLISH 커맨드를 이용해 데이터를 전파할 수 있다.

PUBLISH hello world
(integer) 1

 

- 위의 커맨드를 수행하면 hello라는 채널을 수신하고 있는 모든 서버들에 world라는 메시지가 전파된다

  메시지가 전파된 후에는 메시지를 수신한 구독자의 수가 반환된다. 

 

 

3) 메시지 구독 하기

- SUBSCRIBE 커맨드를 이용하면 특정 채널을 구독할 수 있다. 

> SUBSCRIBE event1 event2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "event1"
3) (integer) 1
1) "subscribe"
2) "event2"
3) (integer) 2

 

- 클라이언트가 위의 커맨드를 수행하면 event1과 event2 채널을 동시에 구독하기 시작한다.

  클라이언트가 구독자로 동작할 때에는 새로운 채널을 구독할 수 있지만

  pub/sub과 관련되지 않은 다른 커맨드를 수행할 수는 없다. 

 

- 구독자가 수행할 수 있는 커맨드는 SUBSCRIBE, SSUBSCRIBE, SUNSUBSCRIBE, PSUBSCRIBE, 

  UNSUBSCRIBE, PING, RESET, QUI이다. 

 

 

4) 클러스터 구조에서의 pub/sub 

 

- 레디스 클러스터 구조에서도 pub/sub을 사용할 수 있다.

  클러스터는 레디스가 자체적으로 제공하는 데이터 분산 형태의 구조다. 

 

- 레디스 클러스터에서 pub/sub을 사용할 때, 메시지를 발행하면

  해당 메시지는 클러스터에 속한 모든 노드에 자동으로 전달된다. 

  따라서 레디스 클러스터의 아무 노드에 연결해 SUBSCRIBE 커맨드를 사용하면 데이터를 수신할 수 있다. 

 

- 하나의 노드에 메시지를 발행하면 메시지는 모든 노드에 전파된다.

  이 방법은 굉장히 간단하고 명료하지만,

  사실 클러스터의 주요 목적을 고려한다면 비효율적인 방식으로 여겨질 수 있다. 

 

- 클러스터는 주로 대규모 서비스에서 데이터를 분산해서 저장하고 처리하기 위해 도입됐으며,

  그렇기 때문에 레디스 클러스터 내에서 pub/sub을 사용할 때 메시지가 모든 레디스 노드에 복제되는 방식은

  클러스터 환경의 핵심 목표와는 부합하지 않으며,

  이로 인해 불필요한 리소스 사용과 네트워크 부하가 발생할 수 있다.