Skip to content

[Concern] 숙소 날짜 예약 시의 동시성 문제 해결 방법 결정

시원 edited this page Jan 26, 2025 · 4 revisions

✨ 배경

예약을 위한 숙소별 날짜 상태를 변경하는 API에 관련해서 분산 환경에서는 다수의 사용자가 동시에 동일한 날짜를 예약하려고 시도할 경우, 데이터 무결성이 깨지거나 상태가 비정상적으로 처리되는 동시성 문제가 발생할 가능성이 있다는 생각이 들었다.

문제 발생 상황 예시

  1. 사용자 A와 사용자 B가 동일한 날짜를 포함해 예약하기 위해 동시에 요청을 보냄
  2. 두 요청이 각기 다른 애플리케이션 인스턴스에서 처리되면서 동일한 날짜에 대한 상태 변경이 동시에 진행
  3. 데이터베이스에서 상태가 중복 예약 또는 비정상 상태로 저장될 가능성이 존재

✨ 사용할 수 있는 기술 검토

image

  1. Lua Script

Lua 스크립트는 Redis 서버에서 직접 실행되며, 여러 Redis 명령어를 하나의 원자적 작업으로 묶어 실행할 수 있는 방법이다. 이를 통해 동시성 문제를 효과적으로 해결할 수 있다. Lua 스크립트를 사용하면 복잡한 로직을 단일 명령어로 처리할 수 있기 때문에, 중간에 다른 클라이언트의 접근을 차단할 수 있다.

  1. Redisson

분산락은 여러 클라이언트가 동시에 동일한 자원에 접근하는 것을 방지하기 위해 사용하는 방법이다. Redis에서는 Redisson과 같은 라이브러리를 사용하여 쉽게 분산락을 구현할 수 있다. 분산락을 사용하면 자원의 동시 접근을 제어하여 데이터 일관성을 보장할 수 있다.

✨ 결정

여러 해결 방법을 비교한 결과, Redisson을 사용한 분산 락을 적용하기로 결정하였다.

LuaScript는 직접 스크립트로 작성해 오류가 발생할 가능성이 있다고 생각했는데 Redis 내에서 실행되기 때문에 일반적인 코드처럼 IDE에서 디버깅하기 어려워 문제가 될 수 있다고 생각했다. Redisson 을 사용하면 락의 획득 및 해제 시간을 조정할 수 있어 요청 시간이 길어지는 경우의 처리 등 유연하게 응답할 수 있다고 생각했고 재시도 로직을 쉽게 구현해 안정성을 높일 수 있다고 생각해 동시성 제어와 유연성, 안전성 면에서 좋다고 생각해 Redisson을 선택했다.

✨ 테스트

테스트 코드를 작성하여 다중 스레드 환경에서 정상적으로 처리가 이뤄지는지 확인하였다.

Clone this wiki locally