비동기 도입 시 발생하는 데이터 불일치 상황을 개선하기 위한 방법
서론

URL 단축기 프로젝트에서 TPS를 높이기 위해 URL 단축 요청 기능의 비즈니스 로직 중 DB 저장 과정을 비동기로 전환했다. 그 결과 TPS가 개선되는 효과를 얻었지만, 동시에 치명적인 데이터 불일치 문제가 발생했다. 이 글에서는 왜 이런 문제가 발생했는지, 그리고 어떤 방식으로 해결할 수 있을지 고민해본 내용을 정리해보려 한다.
문제 원인
앞서 말했듯 URL 단축 요청 기능에서 DB 저장을 비동기로 처리하도록 변경했다. 로컬 환경에서 부하 테스트를 진행한 결과 TPS가 약 55.9% 향상되었지만, 중요한 부분을 놓쳤다. 바로 사용자 응답 시점과 실제 저장 시점이 서로 어긋나며 발생하는 데이터 불일치 문제였다.
예를 들어 사용자가 www.test.com 에 대해 단축 URL 생성을 요청했다고 가정해보자. '
단축 로직은 즉시 실행되어 단축된 URL을 사용자에게 응답하지만, DB 저장이 아직 처리되지 않았다면 어떻게 될까?
사용자가 곧바로 그 단축 URL을 사용하면 DB에는 아직 매핑 정보가 없어 원본 URL을 찾을 수 없어 에러가 발생한다.
'비즈니스적으로 즉시 일관성이 필요한 로직인데 저장을 비동기로 처리'한 것이 문제의 핵심이었다.

해결 방법 1: Redis 캐시 도입
Redis를 캐시 서버로 도입하는 방식이다.
처음에는 로컬 캐시도 고려했지만, 이 프로젝트는 분산 환경을 전제로 하고 있어 서버 간 일관성을 맞춰야 했다. 따라서 별도의 캐시 서버를 두는 것이 필연적이었다.
이 방식은 '복잡성은 올라가지만 저장 자체는 동기적으로 처리한다'는 점에서 핵심 문제를 해결할 수 있는 구조다.
흐름은 아래와 같다.
- 단축 URL 생성
- (동기) 단축URL–원본URL 매핑 데이터를 Redis에 저장
- (비동기) Redis 데이터를 기반으로 DB에 최종 영속화
- 조회 시에는 Redis를 우선 조회, 없다면 DB를 조회하고 DB에 존재하면 캐싱
URL 단축은 생성 직후 바로 조회가 발생하는 구조이기 때문에, Redis에 먼저 동기적으로 저장되는 것이 보장되어야 그동안 발생하던 '요청-저장 간 시점 차이 문제'를 해결할 수 있게 되었다.
장단점을 간단히 정리하면 아래와 같다.
- 장점
- 기존 비동기 저장 문제 해결 (캐시 먼저 저장 → DB 비동기 보완)
- 단점
- Redis 서버 도입이라는 추가 인프라 비용
- Redis 장애 시의 시나리오까지 고려해야 함
해결 방법 2: 비동기를 덜어내고 동기로 원상 복귀
이 방법은 Simple is best라는 말이 딱인 방식이다.
URL 단축은 서비스의 핵심 비즈니스 로직이기에 저장 과정을 비동기로 하지말고 트랜잭션의 ACID 특성에 의존하여 실패 또는 성공을 확실히 하도록 하는것이다. 따라서 저장 로직을 다시 동기로 되돌리고, 트랜잭션으로 완결성을 보장하는 방식이다.
이 경우 TPS는 다소 떨어지지만, 시스템의 단순성,예측 가능성,안정성이 훨씬 높아진다.
사실 실제 서비스 환경에서도 URL 단축 로직을 비동기로 처리하면 이점이 있을까 하는 의심이 있다.
중요한 핵심 비즈니스로직에 비동기를 도입해서 불안정하고 복잡하게 하는것보다, TPS가 조금 떨어지더라고 단순하고 안정적인 동기방식이 적합하지 않을까? URL 단축 기능이 TPS를 향상시켜야할만큼의 트래픽이 발생할까? 같은 고민지점이 새로 생기는것 같다.
후기
이번 경험을 통해 비동기 도입 시 복잡성이 얼마나 급격히 높아지는지를 직접 체감했다. 특히 '특정 시점의 데이터 정합성'이 반드시 지켜져야 하는 시스템에서는 비동기 처리가 매우 신중하게 검토되어야 한다는 점을 배웠다.
비동기 처리하면 예시로 통계, 알림, 로깅 등 핵심 비즈니스와 직접적인 연관이 없는 작업들이 등장하는 이유인거 같았고, 팀장님이 새로운 기술이나 라이브러리 도입에 항상 보수적이었던 이유도 자연스럽게 이해하게 된 경험이었다.
동시에 새로 생긴 의문점도 있다. 만약 Redis를 도입한다면, 이 Redis는 결국 시스템의 핵심 의존성이 될 텐데 그 가용성은 어떻게 보장할 수 있을까? HA 구성이나 Sentinel, Cluster 등 관련 내용을 예전에 읽은 기억이 나지만 정확히는 모르겠다. 추후 이를 공부해 정리해보고 정리해보려 한다.