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의 메시지를 수신받는다.
2-1. Topic 이란?
특정 주제, 제목, 항목 등등 으로 이해하면 쉬울것 같다.
이해하기 쉬운 예로 유튜브를 예로 들겠다.
- 유튜브 채널 = Topic
- 채널 주인 = Publisher
- 구독자 = Subscriber
채널주인이 Topic 에 글을 올리면, 구독자가 새로운 글이 올라왔다는 것을 알림으로 받는 방식을 생각 하면 된다.
3. Pub/Sub 명령어 및 방식
Redis 는 Topic(channel)을 따로 생성하지 않는다.
-> Subscribe가 Topic 을 구독하면 Topic 이 생성되는 방식임.
- Pub/Sub 순서
- Subscriber가 특정 Topic 구독
- 클라이언트가 특정 Topic에 pub
- 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 [채널명] <내용>
- Topic 에 메시지를 발행 했으므로, Sub가 잘 되었는지 확인 해보자.
(이전에 테스트 했던 메시징 또한 같이 출력되어있다.)
3-4. pubsub
해당 명령어는 채널 ,Subscriber를 관리, 체크 할 수있는 명령어다.
3가지의 Option Command를 활용한다.
- channels : 존재하는, 활성화 된 채널.
- numsub : 채널을 구독하고 있는 Subscriber의 갯수 확인.
- 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 pub/sub 에 관해서 알아보게 된 계기는,, Redis Lock 에 대해서 적용에 대해서 알아보던 도중 redisson 라이브러리는 스핀락을 사용하지 않는 방식을 사용하는데, 내부적으로 Redis pub/sub 을 사용한다는,, 이야기를 듣게되서 pub/sub 을 먼저 알아보았다.
만약 redisson 을 사용 하지않고, Redis Lock 을 구현하게 된다면 포스팅을 해보도록 하겠다,,
'DB > Redis' 카테고리의 다른 글
[Redis] Spring Boot - Redis Pub, Sub 구현&응용 (3) | 2024.03.29 |
---|---|
[Redis] Redis를 이용한 임시번호 발급(OTP, 임시비밀번호, 인증문자) - Spring Boot (0) | 2024.03.23 |
[Redis] Redis + Spring boot 연동 (2) (2) | 2023.03.30 |
[Redis] Redis란? - Docker로 간단 Redis(Local) 설치 (1) (1) | 2023.03.29 |
댓글