도입 이유

<aside> 👩🏻‍💻 대기자 동시 등록 시 동시성 이슈 발생

</aside>

1️⃣ 다수의 이용자가 동시에 한개의 스토어에 웨이팅을 등록 할 경우 문제 발생

동작 로직 :

  1. 웨이팅 요청한 사용자의 ID를 확인하여 waiting Table에 동일한 스토어에 웨이팅 등록을 한 이력이 있는지 확인한다. (=중복 등록 불가)
  2. Waiting Table에 이력이 없다면 웨이팅 등록처리가 되고, Waiting Cnt +1 하여 업데이트한다.

문제 발생 상황 : CASE 1 | 1000명의 User가 동시에 웨이팅 신청 시

Untitled

→ 문제 1. 웨이팅 요청이 제대로 저장되지 않음

→ 문제 2. Waiting 테이블의 WaitingCnt(대기자 수)가 정상적으로 반영되지 않음

기술적 선택

선택지 🤔

<aside> 🙋🏻 리뷰 등록 후 스토어 정보 갱신 시 동시성 이슈 발생

</aside>

2️⃣ 다수의 이용자가 동시에 리뷰 등록 시 문제 발생

문제 발생 상황 :

CASE 1 | 500명의 User가 동시에 리뷰 작성

Untitled

→ 문제1. 업데이트 된 리뷰 갯수(review_cnt)의 정합성이 맞지 않음

→ 문제2. 업데이트 된 별점의 무결성이 지켜지지 않음

🌀 Redisson Lock

✅ Redisson으로 선택한 이유

✅ Spring Batch + Scheduler를 선택한 이유

🌀 Spring Batch + Scheduler를 이용한 비동기 업데이트 처리

Untitled

1️⃣. 리뷰 작성 시 Database에 리뷰를 저장하고, Redis Cache에는 리뷰가 작성된 스토어ID를 저장한다

Untitled

2️⃣. 일정시간마다 스케줄러가 동작하면서 Redis Cache에 저장된 스토리 ID를 읽고, 배치 파이프라인을 통해 스토어 정보를 갱신한다. → 스토어 정보 갱신 방법(With.Redis)❓

3️⃣. 데이터베이스에 정보가 업데이트되면 Logstash가 변경된 정보를 추적하여 Elastic Search에 데이터를 업데이트한다.

적용 후 결과

<aside> 👩🏻‍💻 대기자 등록 기능

</aside>

Untitled

Untitled

<aside> 🙋🏻 스토어 정보 갱신 기능

</aside>

Untitled

Untitled

테스트 결과 :

테스트 결과 :

동시에 1000건의 웨이팅 요청이 있을 때 1000건의 요청이 모두 반영된것을 알 수 있다.✨

동시에 1000건의 리뷰가 등록 되었을 때 1000건의 데이터가 모두 업데이트된것을 확인할 수 있다.