메시지 기반의 이벤트 처리 및 메시지 큐 기능을 구현하는 데 사용되는 패턴이다.
발행자(Publisher)가 메시지를 발행하면, 하나 이상의 구독자(Subscriber)가 해당 메시지를 구독하고 수신할 수 있다.
이미지 출처: 에디의 기술블로그
Pub/Sub 메커니즘은 기본적으로 메시지를 메모리에 저장하지 않는다.
Pub/Sub 메커니즘은 실시간 이벤트 및 메시지 전달을 위해 메모리 사용을 최소화하고 빠른 응답 시간을 제공하는 데 목적이 있기 때문이다.
발행된 메시지는 현재 연결된 구독자에게만 전송되고 메모리에 영구적으로 저장되지 않는다.
다만, Redis는 기본적으로 메모리 기반 데이터베이스로 작동하며, 데이터를 인메모리에 저장한다.
따라서 Redis를 사용하면 Pub/Sub 메시지 역시 Redis의 인메모리 데이터 저장 방식을 따른다.
즉, 기본 Redis 설정에서 데이터 지속성을 설정하지 않는 한, 메시지는 Redis 서버가 실행 중인 동안 메모리에 유지된다.
그런데 메모리에 메시지를 저장하고 나중에 검색하는 기능을 추가하려면? 메시지의 영구 저장이 필요할 수 있다.
이를 위해서는 다음과 같은 추가적인 저장 및 관리 로직을 구현해야 한다.
리스트(List) 데이터 구조를 활용하여 발행된 메시지를 리스트에 추가(복사)하고, 나중에 필요할 때 해당 리스트에서 메시지를 검색할 수 있다.
# 메시지 발행
PUBLISH 채널명 메시지내용
# 발행된 메시지를 리스트에 저장
LPUSH 메시지리스트명 메시지내용
# 리스트에서 메시지 검색
LRANGE 메시지리스트명 0 -1
Pub/Sub 이벤트를 수신하고 발행된 메시지를 메모리 이외의 데이터베이스 시스템(Redis, MySQL, MongoDB) 또는 메시지 큐 시스템(RabbitMQ, Apache Kafka)에 저장할 수 있다.
메시지를 영구적으로 저장하고 검색하기 위해서는 Redis 외부에 데이터베이스나 메시지 큐 시스템과 통합하는 것이 일반적인 방법이다.
메시지를 발행하면 해당 메시지는 그 ‘발행 시점’에 레디스 서버의 메모리에 저장되고, 현재 구독 중인 모든 구독자(Subscriber)에게 전송된다.
만약 구독 중인 사람 아무도 없으면, 메시지가 저장되지 않고 발행 시점에 휘발된다.
Q.
구독자1, 구독자2, 구독자3 중 구독자1만 접속한 상태면 구독자2, 구독자3은 그 메시지를 나중에 볼 수 있나?
A.
구독자1만 접속한 상태에서 메시지를 발행하면 해당 메시지는 레디스 메모리에 저장되고, 나중에 구독자2와 구독자3이 연결했을 때 이전에 발행된 메시지를 수신 받게 된다.
즉, 구독자2와 구독자3이 나중에 연결하면, 그 시점부터 레디스 서버가 현재 메모리에 저장된 메시지 중에서 가장 최근 메시지를 전송해준다.