-
Notifications
You must be signed in to change notification settings - Fork 3
이미지 임시 저장소
HyeonSik Choi edited this page Sep 1, 2024
·
11 revisions
LockTime 문제
해결
- 사용자와 커넥션을 맺는 작업과 Database I/O 작업을 각기 다른 서버에서 처리도록 분리하여 성능을 향상시켰습니다.
- 사용자의 입찰 요청이 들어오면 Tomcat 서버는 요청 정보를 받아서 RedisStream에 메세지를 발행하고 커넥션을 종료하는 단순한 역할을 수행합니다.
- RedisStream에 발행된 메세지는 입찰/환불 로직을 전문적으로 처리하는 Consumer Server에서 확인합니다.
- Consumer Server는 발행된 메세지 정보를 기반으로 실제 DB를 참조하여 입찰을 진행하게 됩니다. (재고 수정 및 포인트 차감) 해당 로직이 처리되면 '거래이력'이 생성되게 됩니다.
- 사용자는 '입찰 요청'을 성공적으로 한 이후에 지속적으로 '거래 이력'이 생성됬는지 확인합니다.
- 결론: RPS 증가 + 거래 성공율 증가!
아키텍처 개선 전 후 비교
- 트랜잭션 내부에 타이머를 추가하고, 로직 종료 시점에 해당 타이머 시간을 초과했는지 확인하는 로직을 추가합니다.
- 타임아웃이 발생하는 경우 예외를 발생시키고 트랜잭션을 롤백합니다.
- 이를 통해 트랜잭션의 진행 시간이 분산락의 lease time보다 짧게 만들어 데이터 정합성을 보장했습니다.
자세히보기
문제 상황
- 레디슨락의 LeaseTime을 초과하여 중도 반환하였으나, 어플리케이션 로직 진행 중에는 이를 인지하지 못하고 있게 된다.
- 트랜잭션 Commit 이후 레디슨락을 unlcok하는 시점에서 이를 발견하고 익셉션이 발생하는 경우, 트랜잭션이 롤백되지 않아 데이터 정합성 문제가 발생한다.
문제 상황
- 트랜잭션 타임아웃을 설정하여 해결한 모습