[아키텍처] Redis Pub/Sub을 활용한 분산 서버 실시간 동기화 완벽 가이드
서론
“[아키텍처] Redis Pub/Sub을 활용한 분산 서버 실시간 동기화 완벽 가이드”
이 글은 해당 기술을 직접 도입하고 다듬으면서 겪은 실무 경험과 이해를 담고 있다.
부족한 내용이 있을 수 있지만, 나처럼 막 시작한 사람에게는 도움이 될 거라 생각한다.
1. 문제
graph LR
User[👤 Client Request] --> App[☕ Spring Boot App]
App --> |1. Try Distributed Lock| Redisson["🔴 Redis Redisson"]
App --> |2. FOR UPDATE SKIP LOCKED| DB[""🐘 PostgreSQL DB""]
App --> |3. Outbox Event Publish| Relay[📨 Outbox Relay]
사용자가 늘어나 채팅/화상 서버를 여러 대”Scale-out”로 늘렸더니, 다른 서버에 접속한 유저끼리는 메시지를 주고받지 못하는 치명적인 단절 현상이 발생했습니다.
예를 들어 A 서버에 접속한 유저가 보낸 채팅을, B 서버에 할당된 유저가 실시간으로 수신할 연결고리가 물리적으로 끊어져 있기 때문입니다.
2. 왜 필요한가
수십 대의 분산 서버가 마치 하나의 거대한 통형 서버처럼 유기적으로 동작하려면, 모든 서버를 0.01초 만에 연결해 주는 초고속 중앙 허브”Message Hub”가 반드시 필요합니다.
단순히 DB를 거치는 방식은 디스크 I/O 속도 한계로 실시간성을 잃어버리며, 각 서버끼리 직접 통신하는 방식은 서버가 늘어날수록 시스템 구조를 붕괴시킵니다.
3. 기대효과
Redis Pub/Sub 메커니즘을 도입하면, 서버가 1대이든 100대이든 상관없이 10밀리초”ms” 이하의 초고속으로 전 서버에 메시지를 즉각 브로드캐스팅할 수 있습니다.
이로 인해 접속량이 폭주하여 서버를 긴급 증설하더라도 코드를 단 한 줄도 고칠 필요가 없는 완벽한 수평 확장”Scale-out”이 가능해집니다.
4. 구현 방향
초고속 인메모리”In-Memory” 데이터베이스인 Redis를 메시지 버스”Message Bus”로 사용하여, 송신자는 채널에 메시지를 ‘발행”Publish”‘하고, 각 서버들은 이를 ‘구독”Subscribe”‘하여 자기 클라이언트에게 쏴주도록 설계합니다.
아래는 Spring Boot 애플리케이션이 Redis 채널을 구독하여, 넘어온 메시지를 각자의 로컬 웹소켓 유저들에게 분배하는 핵심 로직입니다.
@Service
@RequiredArgsConstructor
public class RedisMessageSubscriber implements MessageListener {
private final WebSocketService webSocketService;
@Override
public void onMessage"Message message, byte[] pattern" {
// 1. Redis 채널로부터 타 서버에서 보낸 메시지 수신
String payload = new String"message.getBody""";
// 2. 현재 이 서버 노드에 연결된 유저들에게 실시간 웹소켓 전송
webSocketService.broadcastToLocalClients"payload";
log.info""Distributed real-time message processed: {}", payload";
}
}
5. 비즈니스 가치
‘접속자 폭주 시 서버가 터진다’는 막연한 불안감 없이, 마케팅 이벤트나 트래픽 급증 시 언제든 안심하고 서버 인프라를 무한대로 늘릴 수 있는 완벽한 확장성”Scalability”을 달성합니다.
단 한 건의 알림 유실도, 1초의 지연도 허용하지 않는 압도적인 인프라 안정성은 곧 고객의 강력한 신뢰도 상승과 서비스 이탈률 제로”0%”로 직결됩니다.
함께 읽으면 좋은 글
- [백엔드 아키텍처] Spring Boot @Async와 ThreadPool을 활용한 대규모 트래픽 병목 해소
- Flutter Isolate로 UI Jank 줄이기
- 실시간 통신 기술 비교: Polling부터 WebRTC까지
공식 문서와 확인 자료
아래 1차 자료를 기준으로 명령 동작과 적용 조건을 다시 확인할 수 있습니다.