Redis Pub/Sub 이란 무엇인가
Redis Pub/Sub(Publish/Subscribe)은 Redis가 제공하는 메시징 기능 중 하나로, 발행/구독 모델을 기반으로 메시지를 전달하는 구조임.
서버 간 또는 서버와 클라이언트 간에 비동기 메시지를 실시간으로 전달할 수 있도록 하는 기능임.
특정 채널(channel)에 메시지를 발행하면, 해당 채널을 구독 중인 모든 클라이언트가 동시에 메시지를 받을 수 있음.
별도의 큐나 브로커 없이 간단하게 실시간 메시징이 가능하다는 점에서 실시간 채팅, 알림, 스트리밍, 이벤트 브로드캐스트 등에 적합함.
1. Redis Pub/Sub 기본 개념
Pub/Sub 구조는 다음과 같이 구성됨:
Publisher → Channel → Subscriber
- Publisher: 메시지를 발행(publish)하는 주체
- Channel: 메시지를 전달하는 경로 (주제 또는 토픽 개념)
- Subscriber: 특정 채널을 구독하여 메시지를 수신하는 대상
2. Redis Pub/Sub 동작 예시
예시: Redis CLI 에서 확인
터미널 A (Subscriber)
redis-cli
> SUBSCRIBE news
터미널 B (Publisher)
redis-cli
> PUBLISH news "Redis Pub/Sub 메시지 테스트"
결과 (터미널 A에서 확인됨)
1) "message"
2) "news"
3) "Redis Pub/Sub 메시지 테스트"
3. Redis Pub/Sub vs 일반 메시지 큐
항목 | Redis Pub/Sub | 일반 메시지 큐 (예: Kafka, RabbitMQ) |
메시지 저장 | 저장하지 않음 (비영속) | 저장함 (영속) |
메시지 수신 | 실시간으로 구독 중일 때만 수신 가능 | 수신 시점과 무관하게 보장됨 |
복구 가능성 | 불가능 | 가능 (ack, retry 등) |
구조 | 간단하고 가볍고 빠름 | 복잡하지만 신뢰성 높음 |
사용 사례 | 실시간 채팅, 알림, 게임 등 | 트랜잭션 처리, 로그, 이벤트 저장 |
4. Spring Boot에서 Redis Pub/Sub 사용하기
1) 의존성 추가 (Gradle)
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
2) Redis 설정
@Configuration
public class RedisConfig {
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
return container;
}
@Bean
public MessageListenerAdapter listenerAdapter(RedisSubscriber subscriber) {
return new MessageListenerAdapter(subscriber, "onMessage");
}
}
3) Subscriber 구현
@Component
public class RedisSubscriber {
public void onMessage(Message message, byte[] pattern) {
String channel = new String(pattern);
String body = new String(message.getBody());
System.out.println("채널: " + channel + ", 메시지: " + body);
}
}
4) Publisher 구현
@Service
public class RedisPublisher {
private final RedisTemplate<String, Object> redisTemplate;
public RedisPublisher(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void publish(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}
}
5. 실무 활용 사례
- 실시간 채팅 시스템
- 채팅방별 채널을 구성하여 사용자 간 메시지 실시간 송수신 처리
- 멀티 서버 알림 브로드캐스트
- 여러 대의 서버에서 하나의 이벤트를 동시에 전파해야 할 때 유용함
- 게임 서버 이벤트 전파
- 게임 내 이벤트, 상태 변경을 다른 클라이언트에 즉시 전달함
- 실시간 주식 시세/데이터 피드
- 외부 시스템에서 받은 데이터를 여러 구독자에게 실시간으로 전달함
6. Redis Pub/Sub 한계 및 주의사항
항목 | 설명 |
메시지 유실 가능성 | 구독자가 연결되지 않은 상태에서는 메시지를 수신하지 못함 |
순서 보장 없음 | 메시지 순서가 엄격히 보장되지 않음 |
신뢰성 낮음 | ACK, 재전송 기능이 없음 |
스케일 확장 | 구독자 수가 많아지면 부하 분산 고려 필요함 |
→ 신뢰성 있는 메시징이 필요할 경우 Redis 대신 Kafka, RabbitMQ 등을 사용하는 것이 적합함.
정리
Redis Pub/Sub은 간단하고 빠른 실시간 메시징이 필요할 때 적합한 기능임.
채널을 기반으로 메시지를 실시간으로 발행하고, 구독자가 이를 수신함.
구조가 단순하고 구현이 쉬우며 Spring Boot에서도 손쉽게 사용할 수 있음.
단, 메시지 영속성이나 복구 기능이 없기 때문에 정확한 메시지 전달 보장이 필요한 시스템에는 부적합함.
가볍고 빠른 실시간 처리에 적합하므로 채팅, 알림, 게임 이벤트 등 즉시성이 중요한 곳에 많이 활용됨.
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] 퍼사드 패턴 (0) | 2025.05.02 |
---|---|
[Spring Boot] E2E 테스트 (0) | 2025.04.29 |
[Spring Boot] STOMP (1) | 2025.04.26 |
모놀리식 아키텍처와 MSA (0) | 2025.04.24 |
[Spring Boot] Spring JDBC (0) | 2025.04.22 |