[야식마차 선착순 신청] - 데이터 모델 2안 · 동시성 전략 3안 비교 #96
Replies: 10 comments 8 replies
|
2번 추가 내용
|
|
이벤트 테이블 자체는 이것저것 요구사항이 생겼을 때 감안해서 필요해보이고, 레디스 분산락 + DB Update구조로 가는게 무난하지 않을까 싶습니다. |
|
이벤트 테이블은 필요해보이고 레디스 없이 DB Update만으로 충분할 것 같네요 |
|
p2; events 테이블을 한다고하면, 해당 이벤트 이름은 따로 설정을 못하나요? event_date 를 봤을 때 이벤트가 진행하는일자 같은데, 확장성을 고려해서 DATETIME 과 시작이랑 끝 시간대를 받고 처리하는게, 조금 더 나을 것 같다는 생각이 듭니다. |
|
ask; 전체 인원은 약 1,400명이고 아마 동시에 400명 정도는 확정적으로 접근할 수 있다면, 400tps 정도로 추산하고 있다고 하는건데, DB 기준으로 ms 만큼 단위로 처리가 된다고 추산하면, 1000개 정도 될 것 같고, 커넥션 자원이나 로스율을 고려하더라도 400tps 정도는 DB로 충분히 대응이 가능할 것 같습니다
또한 서비스의 특성상 장기적보다는 단발적으로 사용될 확률이 높아서, 단순성이 더 큰 이점으로 작용할 것 같습니다. 부하 테스트의 형태도 예상해보면, 초반 추세가 강하고 ( 1분 정도 ), 그 이후에는 크게 리스크가 강할 정도의 트래픽이 생기지는 않을 것 같습니다 |
|
p4; 오히려, 실험하는 때에 유실이나 기타 장애등으로 긴급 Hotfix 가 배포되어야한다면, 중단 없이 잘 배포가 되는지, 뭔가 처리되는 것이 있으면 Graceful하게 처리되는지에 대한 부분을 신경쓴다면 완성도가 더 높을 것으로 보입니다. |
|
그냥 생각난 부분은 분산락 제어가 필요하다면, DB 1개 기준으로, Redis 만큼의 처리량이 불필요하다면 Named Lock 을 활용해볼 수도 있을 것 같습니다.
|
|
앞서 다른 분들이 대부분 좋은 주제로 달아주셨네요! 저도 가볍게만 남기자면 그리고 태현님께서 오픈 시간을 정책상 미룰 수 있으니, 신청시간을 DATETIME 변경 및 신청시간 판단을 Java가 아니라 원자적 UPDATE 안에서 처리하면 좋을듯 합니다! 또한 단일 원자적 UPDATE에서 RPS를 늘리는 방향으로 Comit 단일 WAS인 점을 활용해 DB 앞에 인메모리 게이트를 두고 명백한 초과분은 DB까지 안 보내고 즉시 거절하는 게 가성비가 좋다고 봅니다.정확한 정원 컷의 최종 보증은 항상 위 조건부 UPDATE가 맡고, 인메모리는 부하만 덜어주는 보조 역할! 항상 파이팅입니다 😎 |
|
글 잘 읽었습니다 ~ ^^ |
|
400명 기준 부하테스트를 완료했습니다. 실제로 400RPS정도가 나왔는데 600, 800명까지 올라갔을때 약 250~300RPS가 나왔네요. 일단 이번 서비스를 하면서 오류가 발생하거나 서버가 중단되는 문제는 발생하지 않을 것 같습니다. 이번에는 이대로 진행하고 매트릭을 보고 next step 도입을 고려해도 될 것 같습니다. 그래도 학부 전체 인원은 1,400명이니까 당장의 next step으로는 1. 데이터 베이스 스킵락, 2.WAS 메모리에서 선착순 처리 로직 수행, 3. MySQL innodb buffer pool 튜닝이 떠오르네요. 다들 좋은 의견 많이 내주셨는데 next step에 대한 고민은 다른 디스커션에서 이야기 해봅시다! |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
비즈니스 요구사항
배경
기존 야식마차는 학생들이 30~60분 전부터 오프라인 줄을 서는 문제가 있었다. 이를 해결하기 위해 모바일 기반 선착순 신청 시스템을 도입하고, 오프라인 대기열을 온라인으로 전환한다. 야식마차 직접 도입 전 간식마차를 시범 운영하여 리스크를 검증한다. 신청자 정보에 대해서는 현장 QR에서 정보를 한번 더 수집한다. 전체 인원은 약 1,400명이고 아마 동시에 400명 정도는 확정적으로 접근할 것으로 예상
운영 정책
핵심 기능
동시성 해결 전략
문제 정의
오후 5:30 신청 오픈 시, 수백 명이 동시에 "신청하기"를 누르는 상황에서 Race Condition이 발생한다.
이 두 단계 사이에 다른 요청이 끼어들면 100명 정원인데 150명이 동시에 성공 응답을 받을 수 있다.
방안 1 — DB 원자적 UPDATE 선점 전략
remaining 필드를 두어 전체 정원에서 차감해 나가는 방식입니다.
장점
단점
150명 정원, 수백수천 경쟁)에서는 충분히 감당 가능방안 2 — 캐시(Redis)를 활용하는 원자적 선점 전략
Redis
장점
단점
방안 3 — DB SKIP LOCKED 분산 슬롯 선점 전략
슬롯 100개를 행으로 미리 생성한다.
FOR UPDATE SKIP LOCKED로 각 요청이 서로 다른 행을 경합 없이 선점한다. 이미 락이 걸린 행을 건너뛰기 때문에 대기(blocking) 없이 병렬 처리된다.장점
단점
데이터 모델링 전략
모델 A — events 테이블 포함
모델 B — events 테이블 없음
선택 근거
GROUP BY event_dateCOUNT 쿼리로 충분지금까지의 비즈니스적 명세로 봤을때 어떤 전략의 조합이 가장 타당할지 고민이 됩니다.
All reactions