[레디스(Redis)] Pub/Sub(Publish/Subscribe)

김지수·2023년 9월 8일
0
💡 Redis: 오픈 소스로 제공되는 인메모리 데이터 스토어 및 키-값 데이터베이스(NoSQL)

Pub/Sub 구조란?

메시지 기반의 이벤트 처리 및 메시지 큐 기능을 구현하는 데 사용되는 패턴이다.
발행자(Publisher)가 메시지를 발행하면, 하나 이상의 구독자(Subscriber)가 해당 메시지를 구독하고 수신할 수 있다.

이미지 출처: 에디의 기술블로그


레디스 Pub/Sub의 주요 특징

  • 메시지는 발행된 즉시 현재 구독 중인 모든 구독자에게 전달됨
  • 메시지는 구독자가 연결 중인 동안에만 수신됨
    따라서 구독자가 연결을 끊거나 비활성 상태인 경우 메시지는 휘발됨
  • 구독자는 여러 채널을 구독하여 여러 주제의 메시지를 동시에 처리할 수 있음
  • 메시지 큐, 실시간 이벤트 처리, 실시간 채팅, 실시간 데이터 업데이트 및 푸시 알림과 같은 다양한 실시간 응용 프로그램에 사용됨

메시지를 영구적으로(물리적으로) 저장하려면?

Pub/Sub 메커니즘은 기본적으로 메시지를 메모리에 저장하지 않는다.
Pub/Sub 메커니즘은 실시간 이벤트 및 메시지 전달을 위해 메모리 사용을 최소화하고 빠른 응답 시간을 제공하는 데 목적이 있기 때문이다.
발행된 메시지는 현재 연결된 구독자에게만 전송되고 메모리에 영구적으로 저장되지 않는다.

다만, Redis는 기본적으로 메모리 기반 데이터베이스로 작동하며, 데이터를 인메모리에 저장한다.
따라서 Redis를 사용하면 Pub/Sub 메시지 역시 Redis의 인메모리 데이터 저장 방식을 따른다.

즉, 기본 Redis 설정에서 데이터 지속성을 설정하지 않는 한, 메시지는 Redis 서버가 실행 중인 동안 메모리에 유지된다.

그런데 메모리에 메시지를 저장하고 나중에 검색하는 기능을 추가하려면? 메시지의 영구 저장이 필요할 수 있다.

이를 위해서는 다음과 같은 추가적인 저장 및 관리 로직을 구현해야 한다.

1. 메시지 저장을 위한 데이터 구조 사용

리스트(List) 데이터 구조를 활용하여 발행된 메시지를 리스트에 추가(복사)하고, 나중에 필요할 때 해당 리스트에서 메시지를 검색할 수 있다.

# 메시지 발행
PUBLISH 채널명 메시지내용

# 발행된 메시지를 리스트에 저장
LPUSH 메시지리스트명 메시지내용

# 리스트에서 메시지 검색
LRANGE 메시지리스트명 0 -1

2. 다른 데이터베이스 또는 메시지 큐 시스템과 통합

Pub/Sub 이벤트를 수신하고 발행된 메시지를 메모리 이외의 데이터베이스 시스템(Redis, MySQL, MongoDB) 또는 메시지 큐 시스템(RabbitMQ, Apache Kafka)에 저장할 수 있다.

메시지를 영구적으로 저장하고 검색하기 위해서는 Redis 외부에 데이터베이스나 메시지 큐 시스템과 통합하는 것이 일반적인 방법이다.



+) 추가 의문!

레디스 Pub/Sub에서 메시지가 인메모리에 저장되는 시점은?

메시지를 발행하면 해당 메시지는 그 ‘발행 시점’에 레디스 서버의 메모리에 저장되고, 현재 구독 중인 모든 구독자(Subscriber)에게 전송된다.

만약 구독 중인 사람 아무도 없으면, 메시지가 저장되지 않고 발행 시점에 휘발된다.


Q.
구독자1, 구독자2, 구독자3 중 구독자1만 접속한 상태면 구독자2, 구독자3은 그 메시지를 나중에 볼 수 있나?

A.
구독자1만 접속한 상태에서 메시지를 발행하면 해당 메시지는 레디스 메모리에 저장되고, 나중에 구독자2와 구독자3이 연결했을 때 이전에 발행된 메시지를 수신 받게 된다.

즉, 구독자2와 구독자3이 나중에 연결하면, 그 시점부터 레디스 서버가 현재 메모리에 저장된 메시지 중에서 가장 최근 메시지를 전송해준다.

profile
안녕하세요

0개의 댓글