Skip to content

이미지 임시 저장소

HyeonSik Choi edited this page Sep 1, 2024 · 11 revisions

우테캠-7-ELEVEN-발표자료 (1)-이미지-7 우테캠-7-ELEVEN-발표자료 (1)-이미지-8 우테캠-7-ELEVEN-발표자료 (1)-이미지-9

우테캠-7-ELEVEN-발표자료 (1)-이미지-10 그림1 그림2 그림3

스크린샷 2024-09-01 오전 10 44 52

image 스크린샷 2024-09-01 오전 10 58 37 스크린샷 2024-09-01 오전 10 59 22 스크린샷 2024-09-01 오전 10 59 54 스크린샷 2024-09-01 오전 11 03 56

LockTime 문제

우테캠-7-ELEVEN-발표자료 (1)-이미지-16 우테캠-7-ELEVEN-발표자료 (1)-이미지-17

Throughput 개선

해결

  • 사용자와 커넥션을 맺는 작업과 Database I/O 작업을 각기 다른 서버에서 처리도록 분리하여 성능을 향상시켰습니다.
  • 사용자의 입찰 요청이 들어오면 Tomcat 서버는 요청 정보를 받아서 RedisStream에 메세지를 발행하고 커넥션을 종료하는 단순한 역할을 수행합니다.
  • RedisStream에 발행된 메세지는 입찰/환불 로직을 전문적으로 처리하는 Consumer Server에서 확인합니다.
  • Consumer Server는 발행된 메세지 정보를 기반으로 실제 DB를 참조하여 입찰을 진행하게 됩니다. (재고 수정 및 포인트 차감) 해당 로직이 처리되면 '거래이력'이 생성되게 됩니다.
  • 사용자는 '입찰 요청'을 성공적으로 한 이후에 지속적으로 '거래 이력'이 생성됬는지 확인합니다.
  • 결론: RPS 증가 + 거래 성공율 증가!

아키텍처 개선 전 후 비교

우테캠-7-ELEVEN-발표자료 (1)-이미지-20 우테캠-7-ELEVEN-발표자료 (1)-이미지-22

💰 분산락과 트랜잭션을 함께 사용

  • 트랜잭션 내부에 타이머를 추가하고, 로직 종료 시점에 해당 타이머 시간을 초과했는지 확인하는 로직을 추가합니다.
  • 타임아웃이 발생하는 경우 예외를 발생시키고 트랜잭션을 롤백합니다.
  • 이를 통해 트랜잭션의 진행 시간이 분산락의 lease time보다 짧게 만들어 데이터 정합성을 보장했습니다.
자세히보기

문제 상황

  • 레디슨락의 LeaseTime을 초과하여 중도 반환하였으나, 어플리케이션 로직 진행 중에는 이를 인지하지 못하고 있게 된다.
  • 트랜잭션 Commit 이후 레디슨락을 unlcok하는 시점에서 이를 발견하고 익셉션이 발생하는 경우, 트랜잭션이 롤백되지 않아 데이터 정합성 문제가 발생한다.

문제 상황
  • 트랜잭션 타임아웃을 설정하여 해결한 모습 image

image

image 우테캠-7-ELEVEN-발표자료 (1)-이미지-0