Redis Pub/Sub 메시징
Redis Pub/Sub 메시징
Redis pub/sub으로 많은 컨슈머에게 실시간 이벤트를 브로드캐스트하는 패턴입니다.
언제 Redis pub/sub을 쓰는가
하나 이상의 프로듀서에서 많은 컨슈머로, 긴밀한 커플링 없이 실시간 이벤트 — 알림, 채팅 메시지, 캐시 무효화 신호, UI 갱신 — 를 브로드캐스트해야 할 때 Redis pub/sub을 사용합니다.
왜 이 문제가 어려운가
서비스 간 point-to-point 통신은 프로듀서·컨슈머 수가 늘수록 깨지기 쉬운 긴밀한 커플링을 만듭니다. 새 구독자마다 또 하나의 통합이 추가됩니다. 흔한 우회 방법들은 실질적인 단점이 있습니다.
- 프로세스 내 이벤트 버스는 인스턴스·서비스 간에 동작하지 않습니다 — 새 파드·워커마다 빈 버스로 시작합니다.
- 전체 메시지 브로커(Kafka, RabbitMQ)는 메시지 영속·재생·전달 보장이 필요 없을 때 과한 운영 오버헤드와 지연을 추가합니다.
- 페어별 직접 연결(한 프로듀서·한 구독자·하드코딩된 URL)은 팬아웃되지 않고 인스턴스 교체에도 버티지 못합니다 — 네 번째 컨슈머를 추가하려면 프로듀서를 건드려야 합니다.
작동하는 브로드캐스트 레이어는 서브 밀리초 팬아웃, 퍼블리셔 측의 구독자별 구성 없음, 명명된 토픽을 통한 이벤트 라우팅 — 그래서 구독자가 퍼블리셔와 조정하지 않고 관심사만 선택할 수 있게 — 이 필요합니다.
영속·재생·at-least-once 전달도 필요하다면, 정답은 pub/sub이 아니라 Redis Streams입니다 — 둘은 같은 인프라에서 다른 문제를 푸니까요.
Redis 솔루션에서 기대할 수 있는 것
다음을 할 수 있습니다.
- 서비스 간 직접 호출 없이 마이크로서비스·파드·엣지 노드 전반에 이벤트를 팬아웃합니다.
- 모든 애플리케이션 인스턴스에 동시에 캐시 무효화를 브로드캐스트합니다.
- 여러 서버 노드의 WebSocket 클라이언트에 실시간 갱신을 푸시합니다(Socket.IO Redis 어댑터 패턴).
- 서브 밀리초 지연으로 사용자 존재·타이핑 표시·라이브 대시보드 갱신을 신호합니다.
- glob 패턴으로 유연한 토픽 계층에 구독합니다 — 단일
orders:*구독이 채널별 배선 없이 모든 주문 이벤트를 포착합니다. - 지속 상태를 일반 Redis 키나 외부 시스템에 두고 pub/sub을 순수하게 전송으로만 사용합니다.
Redis가 이 솔루션을 어떻게 지원하는가
실제로 퍼블리셔는 PUBLISH channel payload를 호출하고, Redis는 해당 채널에 현재 구독 중인 모든 클라이언트에게 메시지가 발행된 순서대로 팬아웃합니다. 구독자는 SUBSCRIBE channel(정확 일치) 또는 PSUBSCRIBE pattern(glob 일치)로 관심을 등록하고, 그 후 연결은 같은 소켓으로 들어오는 메시지를 푸시하는 구독 전용 모드로 전환됩니다. 전달은 at-most-once입니다. 메시지가 발행될 때 오프라인이었던 구독자는 그 메시지를 영원히 놓칩니다.
Redis가 브로드캐스트 메시징에 잘 맞는 이유가 되는 기능들은 다음과 같습니다.
PUBLISH는 채널의 모든 활성 구독자에게 어떤 클라이언트에서든 팬아웃하며, Redis를 통한 서브 밀리초 홉.SUBSCRIBE와UNSUBSCRIBE는 정확 일치 채널 구독용 — 가장 단순한 토픽 기반 라우팅 모델.PSUBSCRIBE와PUNSUBSCRIBE는 glob 스타일 패턴 구독(cache:invalidate:*,news.*.headline)용 — 구독자가 모든 채널을 미리 등록하지 않고 전체 토픽 계층을 들을 수 있게 합니다.PUBSUB CHANNELS,PUBSUB NUMSUB,PUBSUB NUMPAT는 인트로스펙션용 — 활성 채널 나열, 채널별 구독자 수, 활성 패턴 구독 수.- 샤딩된 pub/sub (
SSUBSCRIBE,SPUBLISH)이 Redis 7.0+에서 제공되어, 같은 패턴이 모든 메시지를 모든 노드에 닿게 하지 않고 Redis Cluster에서 수평 확장됩니다. - 메시지 저장 오버헤드 없음 — 메시지는 활성 구독자에게 전달되고 즉시 폐기되어, 메시징 경로를 무상태·고속으로 유지합니다.
- 키스페이스 알림은 같은 pub/sub 전송을 통해 키 변경(
SET, 만료, 퇴출)에 대한 이벤트를 받게 합니다.
생태계 (Ecosystem)
다음 프레임워크·라이브러리가 브로드캐스트 메시징에 Redis pub/sub을 사용합니다.
- Node.js: 크로스 노드 WebSocket 팬아웃용 Socket.IO Redis 어댑터
- Python: WebSocket 푸시·이벤트 리스너용
redis-py구독자 + FastAPI 또는 Django Channels - Java: 서비스 간 메시징용 Spring Data Redis 메시지 리스너 컨테이너
- Ruby: Rails WebSocket 브로드캐스팅용 Action Cable Redis 어댑터
- Go: 이벤트 리스너와 클러스터 전체 알림용
go-redisPubSub - 인프라: Kong·NGINX 이벤트 훅; 공유 Redis 인스턴스를 통한 Kubernetes 클러스터 전체 이벤트 버스
나만의 Redis pub/sub 브로드캐스터를 만드는 코드 예시
다음 가이드들은 간단한 Redis 기반 pub/sub 브로드캐스터를 만드는 법을 보여줍니다. 각 가이드는 다음 클라이언트 라이브러리 각각에 대한 실행 가능한 대화형 데모를 포함합니다.
- redis-py (Python)
- node-redis (Node.js)
- go-redis (Go)
- Jedis (Java)
- Lettuce (Java)
- StackExchange.Redis (C#)
- Predis (PHP)
- redis-rb (Ruby)
- redis-rs (Rust)
더 알아보기 (Learn more)
- Redis Pub/Sub — SUBSCRIBE·PSUBSCRIBE·PUBLISH 기본
- Redis Streams — 영속·재생이 필요할 때의 대안
- Redis 키스페이스 알림 — 키 변경 이벤트 수신