<aside>
<img src="/icons/reorder_gray.svg" alt="/icons/reorder_gray.svg" width="40px" />
목차
</aside>
1. 문제 상황
실시간 채팅 시스템이 v1에서는 STOMP을 사용하여 메시지를 DB에 동기적으로 저장하고 사용자에게 전달하는 방식으로 동작했습니다. 하지만 이 방식은 서버 인스턴스가 한 개일 때만 원활하게 작동하며, 서버 확장(scale-out) 시 메시지 전달에 문제가 발생했습니다. 또한, 동기적으로 메시지를 DB에 저장하기 때문에 성능이 저하되고 확장성에 한계가 있었습니다.
2. 원인 분석
v1의 문제점:
- 동기적인 DB 저장: 메시지가 DB에 동기적으로 저장되므로 메시지 처리 속도가 느려지고 성능 문제가 발생함.
- 서버 확장성 부족: 서버가 한 대일 경우에는 처리할 수 있지만, 서버를 확장할 경우 STOMP을 통한 메시지 전달이 제대로 이루어지지 않음.
- 높은 서버 의존성: 하나의 서버 인스턴스에서만 메시지가 처리되기 때문에 서버 장애나 부하가 있을 경우 채팅 시스템의 가용성이 떨어짐.
3. 문제 해결 의사결정
v2로의 개선:
- STOMP + Redis pub/sub 사용: Redis의 pub/sub 기능을 활용하여 메시지를 즉시 전달하고, 메시지를 비동기적으로 DB에 저장하도록 하여 성능을 개선하고 서버 확장성을 향상시킴.
- 서버 확장성 확보: Redis를 사용하면 서버 인스턴스가 여러 대일 때도 메시지를 빠르게 전달할 수 있게 되어, 서버의 수를 늘려도 안정적인 채팅 서비스 제공이 가능.
- 비동기 DB 저장: Redis로 메시지를 즉시 사용자에게 전달하고, DB에는 비동기적으로 저장하여 처리 속도를 최적화.
4. 적용
- Redis pub/sub 적용: Redis를 사용하여 메시지가 발행되면, 모든 서버 인스턴스가 이를 구독하고 메시지를 즉시 사용자에게 전달하도록 설정.
- STOMP과 Redis의 결합: STOMP 클라이언트는 Redis 채널을 통해 실시간 메시지를 수신하며, 메시지는 Redis에서 구독되는 모든 서버로 전파됩니다.
- 비동기 DB 저장: 메시지는 Redis로 즉시 전달되고, DB에 대한 저장은 비동기로 처리하여 서버 성능에 부담을 주지 않도록 구성.