본문 바로가기
DB/Redis

[Redis] Redis - pub/sub 이란?

by lucas_owner 2023. 7. 16.

1. Message Queue 

pub/sub 은 Message Queue 라는 통신 방법중 하나이다. 

MSA(Micro Service Architecture) 의 구조에서는 모듈A 에서 모듈 B로 API 데이터를 넘겨야 하는 일들이 발생한다.

그런 상황에서 데이터 교환의 목적을 자주 사용되는 개념이다.

 

 

2. Redis pub/sub 이란? 

위에서 설명했던, Message Queue의 메시징 패턴중의 하나이다. 

채팅 시스템, 푸시 알림 시스템, 구독 시스템 과 같은 시스템에 사용된다.

 

- 유의할점

Kafaka 의 경우 Topic 에 pub 되는 메시지들을 저장하는 구조이지만, 

Redis 의 경우 pub 메시지들을 저장 하지 않는다, 그런이유로 Subscriber 가 존재하지 않으면,

메시지가 사라지게 된다. 

 

즉 Redis pub/sub 은 메시지를 저장, 수신확인 이 필요하지 않은 경우에 사용하면 좋은 방법이다. 

(In-memory 방식을 사용하기 때문에 속도가 빠름)

 

다른 MQ(Message Queue) 시스템들 과는 다르게 수신확인을 하지 않기 때문에 전송이 보장되지 않는다.

 

pub/sub 은 각 publish, subscribe를 의미한다. pub(발행), sub(구독)의 개념이다.

- Publisher(발행자): 특정 메시지를 구독자에게 발행.

- Subscriber(구독자): 구독한 Topic에 대하여, Publisher의 메시지를 수신받는다. 

 

pub/sub

 

2-1. Topic 이란? 

특정 주제, 제목, 항목 등등 으로 이해하면 쉬울것 같다. 

 

이해하기 쉬운 예로 유튜브를 예로 들겠다. 

- 유튜브 채널 = Topic 

- 채널 주인 = Publisher

- 구독자 = Subscriber 

 

채널주인이 Topic 에 글을 올리면, 구독자가 새로운 글이 올라왔다는 것을 알림으로 받는 방식을 생각 하면 된다. 

 

 

3. Pub/Sub 명령어 및 방식

Redis 는 Topic(channel)을 따로 생성하지 않는다. 

-> Subscribe가 Topic 을 구독하면 Topic 이 생성되는 방식임. 

 

- Pub/Sub 순서

  1. Subscriber가 특정 Topic 구독
  2. 클라이언트가 특정 Topic에 pub
  3. Topic 을 구독하는 Subscriber 들은 메시지 수신.(sub)
명령어(Command) 사용 패턴 설명(Desc)
subscribe channel [channel ...] 특정 채널 구독, 메시지 수신받음(다중 채널 구독 가능)
publish channel message 메시지를 특정 채널에 발송
pubsub subcommand [argument [argument ...]] Redis에 등록된 채널, 패턴 조회
psubscribe pattern [pattern ...] 채널 이름을 패턴으로 등록
unsubscribe [channel [channel ...]] 특정 채널 구독(sub) 해제
punsubscribe [pattern [pattern ...]] psubscribe로 구독한 패턴 채널 구독 해제

 

3-1. Test 방식

- 테스트를 진행하기 위해서는 기본적으로 Redis 가 설치 되어 있어야 한다. 

- Redis Client 2개를 사용하는 방식을 사용할것이다. (redis-cli 2개 실행)

 

- docker 를 통해 사용하고 있다면, docker exec -it~ 명령어를 통해 터미널 2개에서 실행 시켜주는 방식으로 진행한다. 

 


 

3-2. Subscribe

 

- 특정 topic(채널) 을 구독해보자. 

# 채널 구독
$subscribe [채널명]

# 다중 채널 구독
$subscribe [채널명1], [채널명1] ...

- room1 을 구독하고 구독하고 있다는 의미의 integer 1을 리턴한다. 

 


 

3-3. publish

- room1 을 구독하는 subscribe 가 존재하니, 해당 채널에 pub을 하여, subscriber에게 메시지를 전달해보자. 

 

# 특정 채널에 메시지 발행
$publish [채널명] <내용>

pub

- Topic 에 메시지를 발행 했으므로, Sub가 잘 되었는지 확인 해보자. 

 

 

sub

(이전에 테스트 했던 메시징 또한 같이 출력되어있다.)

 


 

3-4. pubsub 

해당 명령어는 채널 ,Subscriber를 관리, 체크 할 수있는 명령어다. 

3가지의 Option Command를 활용한다. 

 

  1. channels : 존재하는, 활성화 된 채널.
  2. numsub : 채널을 구독하고 있는 Subscriber의 갯수 확인.
  3. numpat : 패턴형으로 등록된 Subscriber 갯수 확인. 
# 활성화 된 채널 확인.
$pubsub channels
#(empty array) - 존재하지 않을 시
# room1 - 채널존재시, 채널명

# 클라이언트수 확인
$pubsub numsub room1
> room1
> 1


 

3-5.  pubscribe 

- 수신할 채널 이름의 패턴을 등록한다.

# 패턴을 등록하여 수신시작
$psubscribe r*
Reading messages...
1) "psubscribe"
2) "r*"
3) (integer) 1

# 패턴 채널을 등록된 채널에는 포함되지 않음
127.0.0.1:6379> $pubsub channels
1) "room1"

# 패턴 조회 : 1개 확인
127.0.0.1:6379> $pubsub numpat
(integer) 1

# 등록하지 않았던 채널 ch2로 메시지 보냄
$publish room2 "test 2"
(integer) 1

# 패턴으로 구독 신청한 채널에 메시지가 추가됨
$psubscribe r*
Reading messages...
1) "psubscribe"
2) "r*"
3) (integer) 1
1) "pmessage"
2) "r*"
3) "room2"
4) "test 2"

 


 

3-6.  구독 취소 - unsubscribe / punsubscribe

ctrl + c 커맨드를 사용하여 구독을 종료 할 수도 있지만, 서버에서 client 를 관리한다거나, 레디스 클라이언트가 별도로 생성되어 있다면, 

해당 명령어를 통해 구독을 취소할 수 있다 (sub 취소) 

 

*** 채널명을 입력하지 않는다면, 등록된 모든 채널을 삭제, 구독취소 하게된다. 

$unsubscribe room1
1) "unsubscribe"
2) "room1"
3) (integer) 1

$punsubscribe r*
1) "punsubscribe"
2) "r*"
3) (integer) 1

 


2024.03.29 추가

Pub, Sub 이론을 기반으로, Spring Boot 내부에 구조를 만들고 설정을 통해 pub/sub 테스트 글 추가.

 

https://lucas-owner.tistory.com/68#comment9168239

 

[Redis] Spring Boot - Redis Pub, Sub 구현&응용

목차 Spring Boot - Redis 환경 구성 테스트 개요 서버간 데이터를 동기화 하기 위해, 방법을 찾다가 Redis Pub/Sub 을 사용하는것이 현상황에서 최선이라는 판단을 내리고, 알아보게 되었다. (A - B 각서버

lucas-owner.tistory.com

 


Redis pub/sub 에 관해서 알아보게 된 계기는,, Redis Lock 에 대해서 적용에 대해서 알아보던 도중 redisson 라이브러리는 스핀락을 사용하지 않는 방식을 사용하는데,  내부적으로 Redis pub/sub 을 사용한다는,, 이야기를 듣게되서 pub/sub 을 먼저 알아보았다.

 

만약 redisson 을 사용 하지않고, Redis Lock 을 구현하게 된다면 포스팅을 해보도록 하겠다,,

반응형

댓글