<aside> 👩🏻💻 대기자 동시 등록 시 동시성 이슈 발생
</aside>
1️⃣ 다수의 이용자가 동시에 한개의 스토어에 웨이팅을 등록 할 경우 문제 발생
동작 로직 :
문제 발생 상황 : CASE 1 | 1000명의 User가 동시에 웨이팅 신청 시
→ 문제 1. 웨이팅 요청이 제대로 저장되지 않음
→ 문제 2. Waiting 테이블의 WaitingCnt(대기자 수)가 정상적으로 반영되지 않음
선택지 🤔
<aside> 🙋🏻 리뷰 등록 후 스토어 정보 갱신 시 동시성 이슈 발생
</aside>
2️⃣ 다수의 이용자가 동시에 리뷰 등록 시 문제 발생
동작 로직 :
작성된 리뷰를 데이터베이스에 저장
리뷰가 작성된 스토어의 정보를 확인하여 리뷰 Cnt에 1을 더하고, 리뷰 평점을 계산하여 업데이트한다.
문제 발생 상황 :
CASE 1 | 500명의 User가 동시에 리뷰 작성
→ 문제1. 업데이트 된 리뷰 갯수(review_cnt)의 정합성이 맞지 않음
→ 문제2. 업데이트 된 별점의 무결성이 지켜지지 않음
🌀 Redisson Lock
Lock에 타임아웃을 지정할 수 있어서 무한정 대기 상태로 빠질 수 있는 위험이 없음
pub/sub기능을 사용하여 스핀락을 사용하지 않음
⇒ 락이 해제되면 락을 subscribe하는 클라이언트에게 락이 해제되었다는 신호를 보내기 때문에 클라이언트들은 락 획득 확인 요청을 redis로 보내지 않음
<aside> 🌟 pub/sub 기능을 이용한 Redisson의 Lock 획득 프로세스
1. tryLock을 호출하여 락 획득에 성공하면 True를 반환
2. Pubsub를 이용하여 메세지가 올 때 까지 대기하다가 락이 해제되었다는 메세지가 오면
대기를 풀고 다시 락 획득을 시도
2.1 락 획득에 실패하면 다시 락 해제 메세지를 기다림 2.2 타임아웃시까지 위 프로세스를 반복하다가 타임아웃 시간이 지나면 최종적으로 false를 반환하고 락 획득에 실패했음을 알림
</aside>
✅ Redisson으로 선택한 이유
✅ Spring Batch + Scheduler를 선택한 이유
🌀 Spring Batch + Scheduler를 이용한 비동기 업데이트 처리
1️⃣. 리뷰 작성 시 Database에 리뷰를 저장하고, Redis Cache에는 리뷰가 작성된 스토어ID를 저장한다
2️⃣. 일정시간마다 스케줄러가 동작하면서 Redis Cache에 저장된 스토리 ID를 읽고, 배치 파이프라인을 통해 스토어 정보를 갱신한다. → 스토어 정보 갱신 방법(With.Redis)❓
3️⃣. 데이터베이스에 정보가 업데이트되면 Logstash가 변경된 정보를 추적하여 Elastic Search에 데이터를 업데이트한다.
<aside> 👩🏻💻 대기자 등록 기능
</aside>
<aside> 🙋🏻 스토어 정보 갱신 기능
</aside>
테스트 결과 :
테스트 결과 :
동시에 1000건의 웨이팅 요청이 있을 때 1000건의 요청이 모두 반영된것을 알 수 있다.✨
동시에 1000건의 리뷰가 등록 되었을 때 1000건의 데이터가 모두 업데이트된것을 확인할 수 있다.