대용량 트래픽 처리 전략: Redis와 이벤트 기반 아키텍처
대용량 트래픽을 안정적으로 처리하는 것은 현대 소프트웨어 시스템에서 필수적인 과제입니다. 이 글에서는 Redis의 활용과 이벤트 기반 트랜잭션 분리라는 두 가지 핵심 전략을 통해 대용량 트래픽 환경에 대응하는 방안을 담담하게 살펴봅니다.
1. Redis를 활용한 대용량 트래픽 처리 전략 (트래픽 및 데이터 접근 완화)
Redis는 데이터베이스(DB)로 향하는 트래픽 부하를 최소화하고 동시성 문제를 해결하는 데 중점을 둡니다.
캐싱을 통한 DB I/O 감소
Redis는 조회 비용이 크거나 자주 변하지 않는 데이터를 캐시하여 애플리케이션의 응답 속도를 개선합니다. 대용량 트래픽 상황에서 도입하면 매우 효과적이며, 이를 통해 DB I/O를 줄일 수 있습니다.
분산락을 통한 동시성 제어
Redis는 다수의 요청이 동시에 특정 데이터에 접근하고 수정할 때 발생하는 “동시성 이슈”를 해결하기 위한 분산락 기술로 사용됩니다. 이는 DB Connection을 필요로 하는 비관적/낙관적 락에 비해, 대용량 트래픽을 데이터베이스까지 그대로 전달하지 않는 좋은 완충장치로 작용합니다.
대기열/트래픽 제어
콘서트 서비스나 이커머스 서비스의 쿠폰 발급과 같은 시나리오에서, Redis를 활용해 일정한 트래픽만을 허용하는 대기열을 구현하여 데이터베이스의 부하를 최소화할 수 있습니다. Redis는 대용량 트래픽 관련 면접에서 가장 많이 질문하는 서비스 중 하나로, 단순한 캐시 이상의 다양한 활용 방법으로 고도화되어야 합니다.
2. 이벤트 기반 트랜잭션 분리 (비즈니스 로직 및 트랜잭션 범위 최적화)
이벤트는 비즈니스 로직이 수행되는 과정에서 트랜잭션의 범위를 줄이고, 관심사(Concern)를 분리하여 시스템의 안정성과 가독성을 높이는 데 중점을 둡니다.
트랜잭션 범위 최소화
시스템의 부하를 최소화하기 위해 락의 범위뿐만 아니라 트랜잭션 규모 또한 무결성이 보장되는 수준에서 가장 최소화해야 합니다. 이벤트는 비대해진 트랜잭션 내의 각 작업을 작은 단위의 트랜잭션으로 분리할 수 있도록 활용됩니다.
핵심 로직과 부가 로직의 분리
하나의 트랜잭션 내에서 DB와 무관한 작업 (예: 외부 API 호출)을 수행하면 트랜잭션이 길어지거나, 외부 작업의 실패가 전체 비즈니스 로직을 롤백시키는 문제를 유발할 수 있습니다. 이벤트를 활용하면 ‘주문_정보_전파’와 같은 부가 로직을 비동기(Async) 처리하고, 핵심 로직(유저 포인트 차감, 결제 정보 저장, 주문 상태 변경)이 영향을 받지 않도록 분리합니다. 이를 통해 트랜잭션 내에서 외부 API 호출의 실패나 수행이 주요 트랜잭션에 영향을 주지 않도록 구성할 수 있습니다.
관심사 분리 및 느슨한 결합
이벤트 기반 모델링은 코드의 강한 결합을 분리하며, 각 작업이 이벤트에 의해 본인의 관심사만 수행하도록 하여 비즈니스 로직 간의 의존을 느슨하게 합니다. 핵심 로직(예: OrderPaymentService의 결제)에서 부가 로직(예: 알림톡 발송, 데이터 플랫폼 전송)을 분리함으로써 코드의 가독성이 훨씬 좋아집니다.
3. 레디스 활용 전략과 이벤트 기반 분리의 관계
Redis 전략과 이벤트 기반 트랜잭션 분리는 대용량 트래픽 처리라는 공동의 목표를 달성하기 위해 보완적으로 작동합니다.
- Redis가 트래픽을 필터링하고 완충: Redis는 대용량 요청이 데이터베이스와 메인 애플리케이션 서비스로 직접 전달되는 것을 막아줍니다 (예: 캐싱, 대기열). 이를 통해 시스템이 처리해야 할 요청의 수를 관리 가능한 수준으로 조정합니다.
- 이벤트가 트랜잭션 부하를 분산: 조정된 요청이 메인 비즈니스 로직에 도달했을 때, 이벤트 기반 분리는 하나의 요청이 유발하는 트랜잭션의 무게와 시간을 줄여줍니다. 느리고 실패 가능성이 있는 부가 작업을 비동기로 분리함으로써 (예: AFTER_COMMIT 후 비동기 처리), 핵심 트랜잭션이 최대한 빨리 완료되고 다음 요청을 처리할 수 있도록 합니다.
요약하자면, Redis는 트래픽의 양적 문제를 해결하여 시스템의 가용성을 높이고, 이벤트 분리는 비즈니스 로직의 복잡성과 트랜잭션 범위의 문제를 해결하여 시스템의 안정성과 처리 속도를 향상시켜 대용량 트래픽 환경에 대비합니다.