콘텐츠로 이동

Redis Pub/Sub과 Stream

Redis는 단순 저장소뿐 아니라 Pub/Sub과 Stream으로 메시징 기능도 제공합니다. 다만 메시지 내구성, 재처리, 대규모 운영 요구가 크면 Kafka 같은 전용 브로커와 비교해야 합니다.

용어

용어 의미
Pub/Sub publisher가 channel에 메시지를 보내면 subscriber가 즉시 받는 방식
Channel Pub/Sub 메시지를 주고받는 이름
Keyspace Notification key 변경 이벤트를 Pub/Sub으로 알려주는 기능
Stream Redis의 append-only 메시지 로그 자료구조
Consumer Group Stream 메시지를 여러 consumer가 나누어 읽는 그룹
PEL Pending Entries List, 소비됐지만 ACK되지 않은 메시지 목록

질문

Pub/Sub과 Stream은 무엇이 다른가?

구분 Pub/Sub Stream
저장 구독 중인 client에게만 전달 메시지가 stream에 저장됨
재처리 어려움 ID 기준 재조회 가능
Consumer Group 없음 지원
사용처 실시간 알림, cache invalidation 작업 처리, 소규모 이벤트 로그

Pub/Sub

SUBSCRIBE notification:user-1
PUBLISH notification:user-1 "new-message"
장점 단점
구조가 단순하고 빠름 subscriber가 없으면 메시지 손실
실시간 fan-out에 적합 재처리와 내구성 부족

Pub/Sub 사용 사례

사용처 설명
서버 간 cache invalidation 특정 key 삭제 알림
실시간 알림 접속 중인 사용자에게 즉시 전달
설정 변경 전파 여러 인스턴스 local cache 갱신

Pub/Sub 한계

Pub/Sub은 "지금 접속한 subscriber에게 즉시 전달"하는 모델입니다. 메시지를 저장해두고 나중에 읽는 구조가 아닙니다.

주의: 결제, 주문, 재고처럼 유실되면 안 되는 이벤트는 Pub/Sub 단독으로 처리하지 않는다.

Keyspace Notification

Keyspace Notification은 key 만료, 삭제, 변경 같은 이벤트를 Pub/Sub으로 받을 수 있게 합니다.

CONFIG SET notify-keyspace-events Ex
SUBSCRIBE __keyevent@0__:expired
장점 주의
TTL 만료 이벤트를 감지할 수 있음 설정 필요
간단한 후속 처리에 유용 이벤트 유실 가능성을 고려해야 함

Stream

Stream은 메시지를 ID와 함께 저장합니다.

XADD order-events * type ORDER_CREATED orderId 1001
XRANGE order-events - +
특징 설명
append-only 메시지가 순서대로 추가됨
ID 기반 조회 특정 ID 이후 메시지를 읽을 수 있음
Consumer Group 여러 consumer가 나누어 처리 가능
ACK 처리 완료를 Redis에 알림

Stream Consumer Group

XGROUP CREATE order-events order-service $ MKSTREAM
XREADGROUP GROUP order-service consumer-1 COUNT 10 STREAMS order-events >
XACK order-events order-service 1740000000000-0
명령 의미
XGROUP CREATE consumer group 생성
XREADGROUP group으로 메시지 읽기
XACK 처리 완료
XPENDING 처리 중인 메시지 확인
XCLAIM / XAUTOCLAIM 오래 pending 된 메시지 인계

Pending Entries List

PEL은 consumer가 읽었지만 아직 ACK하지 않은 메시지 목록입니다.

XPENDING order-events order-service

consumer가 죽으면 메시지가 PEL에 남을 수 있습니다. 다른 consumer가 XAUTOCLAIM으로 가져와 재처리할 수 있습니다.

Stream 메시지 재처리

상황 대응
consumer 장애 PEL 확인 후 claim
처리 실패 재시도 횟수 제한 후 DLQ stream
poison message 실패 원인과 원본 ID 저장
중복 처리 idempotency key 사용

Redis Stream vs Kafka

기준 Redis Stream Kafka
운영 규모 소규모~중간 규모에 단순 대규모 이벤트 스트리밍
보관 Redis 메모리와 trim 정책 영향 긴 retention과 디스크 로그
재처리 가능하지만 운영 도구 제한 offset 기반 재처리 강점
consumer group 지원 강력한 생태계
사용 기준 Redis 안에서 가벼운 이벤트 처리 서비스 간 핵심 이벤트 파이프라인

베스트 프랙티스

권장 방식 이유
Pub/Sub은 유실되어도 되는 알림에 사용 저장·재처리 모델이 아님
Stream은 trim 정책 설정 무한 증가 방지
consumer는 멱등하게 구현 재처리와 중복 대비
실패 메시지는 DLQ stream으로 격리 전체 소비 중단 방지
Kafka와 역할 구분 장기 이벤트 로그는 Kafka가 더 적합한 경우가 많음

실무에서는?

사용처 추천
local cache 무효화 알림 Pub/Sub
채팅 presence 알림 Pub/Sub
간단한 비동기 작업 Stream
결제·주문 이벤트 전파 Kafka 우선 검토
Redis 내부 작업 재처리 Stream + consumer group

관련 파일: - Kafka - 캐시 전략과 정합성 - 장애 대응과 트러블슈팅