CS 지식

PubSub 구조에 대해서

Tommy__Kim 2023. 5. 7. 08:23

Redis는 key - value 기반의 캐시 저장소이지만, 캐시 기능 외에도 다양하게 사용되는 오픈소스입니다. 

그중 pub/sub 기능에 대해서 알아보고 공부해 볼 예정입니다.

 

Message Queue vs Pub Sub

Message Queue와 Pub Sub 방식은 둘 이상의 서비스가 서로 통신하기 위해 분산 시스템에서 사용되는 일반적인 패턴입니다.

 

Message Queue

Message Queue는 Publisher와 Queue를 통해 통신하는 다수의 Consumer로 구성됩니다. 

Queue 통신 방식은 Publisher가 Consumer에게 메시지를 전달하는 단방향 구조입니다.

Publisher가 Queue에 메시지를 주입하면 한 명의 Consumer가 이 메시지를 받는 방식입니다. 

 

예제를 통해 알아보도록 하겠습니다. 

본 예제에서는 Publisher 1명, Consumer 2명이 있습니다. 

Publisher가 Queue에 n+1번째의 메시지를 전달하고 있고 Queue에는 이미 n개의 message가 쌓여 있는 구조입니다.

Queue메시지 중 m1은 Consumer A를 위한 메세지라고 가정해 보겠습니다. 

그림에서 볼 수 있듯 m1 메시지는 Consumer A 에게만 전달된 것을 확인할 수 있습니다. 

또한 전달된 메시지는 Queue에서 빠졌으며, Publisher가 제공한 메세지는 Queue에 들어간 것을 확인할 수 있습니다.

 

Pub Sub

Pub Sub은 Message Queue와 다르게  Publisher가 메시지를 발행하면 Topic에 구독하고 있는 Subscriber 모두에게 메세지를 전달하는 방식입니다.

 

예제를 통해 알아보도록 하겠습니다.

Consumer A, Consumer B가 특정 Topic을 구독하고 있습니다.

Publisher가 A, B가 구독하고 있는 Topic에 메세지를 발행하고 있습니다. 

Pub Sub 구조에서는 구독자인 A, B 모두에게 메세지를 발행합니다. 

구독은 Queue를 기반으로 되어있습니다. 

m1 메시지가 구독자 A, B에게 전달되고 Queue에서 빠지고 Publisher가 발행한 메시지는 Queue로 전달되는 것을 확인할 수 있습니다. 

 

Redis로 알아보는 Pub Sub

채팅 기능 혹은 푸시 알림 등에 Redis Pub Sub 기능을 주로 사용합니다. 

Redis의 Pub Sub 구조는 매우 단순한 구조로 이루어져 있습니다. 

Redis의 특징은 다음과 같습니다.

  • 메시지를 던지는 시스템 
    • 메세지를 별도 보관하지 않는다.
  • 전송 보장을 하지 않는다.
    • 구독 대상이 없는 상황에서 메세지를 publish 하면 소멸된다.
    • 메세지큐와 달리 수신을 확인하지 않습니다.
  • In-Memory 기반 데이터 베이스 
    • 매우 빠르게 메시지를 받을 수 있습니다. 

 

Redis의 Pub Sub에서 사용하는 명령어는 다음과 같습니다. 

subscribe 채널을 구독해 메세지를 수신 받음
publish 특정 채널로 메세지 발송
pubusb 서버에 등록된 채널 혹은 패턴 조회 
psubscribe 채널 이름을 패턴으로 구독
unsubscribe subscribe로 구독한 채널 구독 해제
punsubscribe psubscribe로 구독한 채널 구독 해제

 

예제를 통해 알아보려고 합니다. 

 

간단한 실습을 위해 docker를 사용하도록 하겠습니다. 

 

1. 레디스 최신 이미지 가져오기 

docker pull redis

 

2. 레디스 서버 실행하기 

docker run --name redis -d -p 6379:6379 redis

 

3. 레디스 서버 terminal로 실행 (두 가지를 띄워주면 됩니다.)

docker exec -it redis /bin/bash

 

4. 도커의 redis-cli 접속하기

redis-cli -p 6379

subscribe

 

subscribe의 경우 

subscribe [원하는 채널 명] 하면 특정 채널을 구독하는 방식이 됩니다. 

해당 예시는 하나의 채널만 구독했지만 여러 가지 채널을 구독하고 싶은 경우

subscribe [구독하고자 하는 채널 명] [구독하고자 하는 채널 명] [구독하고자 하는 채널 명] 명령어를 사용하면 됩니다. 

 

publish

publish의 경우 

publish [채널명] [메시지] 형식으로 발행할 수 있습니다. 

publish 명령어를 치면 몇 명의 Subscriber에게 전송되었는지 알 수 있습니다. 

 

channelA 채널에 메시지를 발행한 결과 구독하고 있던 구독자가 메세지를 받은 것을 확인할 수 있습니다. 

 

pubsub 

pubsub 명령어는 세 가지 방식으로 사용됩니다. 

  • pubsub channels : 활성화된 채널 수 확인 
  • pubsub numsub : 특정 채널을 구독하고 있는 subscriber 수 확인 (pattern으로 구독하는 구독자는 count 하지 않습니다.)
  • pubsub numpat : pattern subscriber 수 확인 (전체 채널에 대한 subscriber 수)

 

psubscribe 

패턴으로 채널을 구독하는 형식 

  • ? : 한 글자를 대치합니다
    • h? : ha, he 등등을 의미합니다.
  • * : 공백 혹은 여러 글자를 대치합니다.
    • c* : channel, car 등등을 의미합니다.
  • [문자, 문자, 문자 ***]  : [] 괄호 안에 있는 문자만 올 수 있습니다. 
    • c [a, e, r] : ca, ce, cr 만 가능합니다. 

c*을 통해 psubscribe을 한 것을 확인할 수 있습니다. 

c* 은 c로 시작하는 모든 채널명을 구독할 수 있습니다.

 따라서 channelA, channelB에 발행된 메시지 모두를 구독할 수 있습니다. 

 

unsubscribe / punsubscribe 

기본적으로 terminal에서는 ctrl + c를 누르면 구독을 종료할 수 있습니다.

그 외에 별도 클라이언트로 구독 중이라면 unsubscribe / punsubscribe를 통해 구독을 취소할 수 있습니다. 

  • unsubscribe : 구독 중인 채널 구독 중지
    • unsubscribe 채널명 
  • punsubscribe : 구독 중인 패턴 채널 구독 중지 
    • punsubscribe 패턴

 


[출처]

Baeldung

Inpa Dev

 

'CS 지식' 카테고리의 다른 글

강타입 언어에 대해서  (0) 2023.05.05
REST API에 대해서  (0) 2023.05.04
Polling / Long Polling / Server Sent Event / Web Socket  (0) 2023.05.02
OSI 7계층 TCP / IP 4계층  (0) 2023.04.21