- 이거는 뭘까요?
- 번호표가 있고, 창구 수가 제한되어있죠. 은행가면
- 그런 흐름으로 구현하느 거 하나
- 얘는 대기열 / 참가열 같이 구현할 수있음 .
- 대기 좌석에 있느 사람 + 창구 좌석에 있느 ㄴ사람
- => 대기 정보를 좀 빡세게 구해야함 => 대신에 구체적으로 구할 숭 있음
- 회전 목마처럼 돌아가는 것
- 놀이공원 가면 줄서잖아요.
- 근데 한명씩 들어가요?
- 뭉탱이로 들어가잖요. 놀이공원 그 기구가 한 사이클 다 끝날때까진 몇명이 들어가있던 기다려야 되잖아요.
- 일단 10명씩 들여보내준다. 근데 앞에서 2명 먼저 끝났다고, 이 2명을 들여보내 주진 않음.
- 무조건 10명씩 처리
- 얘는 하나만 써도 된다. 오버엔지니어링 피할 수 있음
- 대신 대기 시간은 더 길어진다.
- => 이거의 장점 ))))) 대기 정보를 쉽게 구할 수 있음. 대신에 러프하게 구할 수 있음
놀이공원식으로 개발한다?
공식을 활용할 수 있다.
입장 가능한 시간을 구할 수 이써요...
const 놀이공원이 돌아가는 시간 = 10분; <- 이라고 가정 했을 때,
var 대기열에 들어온 순서 = 앞에 놈들 카운트 + 1;
var 분당 처리량 = 놀이기구 하나에 입장할 수 있는 인원 수;
var 입장 가능 시간 = 현재 시간(토큰이 생성된 시간) + ( 대기열에 들어온 순서 / 분당 처리량) * 놀이기구 돌아가는 시간;
SELECT 입장 가능 시간 FROM 대기열 WHERE 무슨 조건;
쿼리 한 번으로 검증할 수 있음. .
참고
https://kyulog.hashnode.dev/hhplus-backend-wil-5
(항해플러스) 서버 구축 과제를 마치고
콘서트 좌석 예약 시나리오를 택하다. 🦄 과제 보러가기: https://github.com/KimH4nKyul/hhplus-concert-tickets-service-nest "진짜 사나이는 어려움을 피하지 않는다." 는 패기와 함께 선택한 콘서트 좌석 예약
kyulog.hashnode.dev
-
은행창구식
-
은행 갔을 때 대기 번호를 뽑잖아요
-
한 명씩 들어가는데
-
대기 좌석이 있고, 창구 좌석이 있다
-
그래서 이거랑 유사하게 돌아간다.
-
대기열 / 참가열이 있다.
-
열을 두 개 둔다.
-
한 명이 끝나면 띵동 울리면서 창구로 이동
-
대충 이런 방식 (창구로 이동하면 서비스 이용할 수 있음)
-
-
놀이공원식
-
우리가 놀이공원을 갔다.
-
놀이기구를 타려고할 때
-
줄을 섭니다.
-
이 때 한 명씩 들어갑니까?
-
여러명씩 한 번에 들어간다.
-
그리고 들어 갔어요. 근데 인원이 다 안채워져있어도 놀이기구 운행은 되죠?
-
10명 맥시멈인데 줄에 8명밖에 안서있으면 일단 8명 들여보내고 운행을 합니다.
-
그리고 나서 나중에 찾아온 사람들이 있는데, 안들여보내주죠.
-
운행 중이니까
-
이런것처럼 뭉탱이로 한 사이클에 들여보내고, 뒤에 후순위들은 무한정 대기 시킨다.
-
는게 놀이공원식입니다.
-
여기서 질문 받겠습니다.
-
구체적으로 질문해주세요.
-
은행 창구식 장/단점 )
-
맞습니다. 실시간성이 어느정도 보장됩니다.
-
실시간성이 보장 된다?
-
DB로 구현하면 부하 포인트가 늘어난다.
-
왜? 실시간 보장해야 하니까. 계속 쿼리를 날려서 검증해야 한다.
놀이 공원식 장/단점 )
-
엄연히 실시간이 아니어도 된다.
-
왜냐면 들여보낼 수 있는 시간이 정해져 있다.
-
그 시간에만 쿼리를 날리면 된다.
-
기준) 놀이기구가 운행 시작해서 끝나는 한 Term 시간이 기준
-
유저마다 예약을하고 결제하는데 까지 걸리는 시간이 다 다를수 있음
-
누구는 빨리하고, 누구는 느리게 해요.
-
근데 이거를 상관하지 않고, 네
-
맥시멈을 정해놔서 그 시간 동안에 못하면 더이상 서비스에 못하고
-
다시 대기열을 타야합니다.
그럼 검증해서 들어온 애들이 퇴장해야할 시기가 없으면 커넥션 풀 터지죠.
그래서 맥스타임(= 놀이기구 하나가 끝날때 까지 걸릴 시간) 을 설정 해야 놔야 한다......
안그러면 계속해서 서비스를 있게 되잖아요.
그러면 뒤에 있는 애들이 특정 시점에 커넥션 풀 터져서 서비스 이용을 못할 수도 있어요.
RDB로 했을 때 대기순서를 알려면 카운트를 두긴 해야 합니다.
아니면 오토인크리먼트 써야 하는데............ <-- 만약에 오토인크리먼트된 결과를 가져와서 써야하는 순간이 있다면 조회 쿼리 이라서.......... 그래서디비할 때는 순서를 알아야 되잖아요.
대기 정보를 사용자한테 제공하려면 +1
맞아요.
저는 들어있는 애 세는걸 선택하긴 했어엇용...
그리고 대기순서랑 남은시간은 정확할 필요는 없습니다.
정확성 <--- 어느정도 그래도 보장하고 싶다하면 은행창구 편하긴 함
얘는 만들 때 앞에 애들 지우고 뭐하고 할거 아니에요. 그쵸 서비스 이용끝난 애들 지우고 + 이용중인 애들 세고
그러면 어느정도 정확하겠죠?
놀이공원식 <-- 뭉탱이로 들여보내고 누가 끝나던 상관없이 운행 시간을 지켜야함 <-- 앞에 몇-명이 이용끝났는-지 몰르니까 정 확히 셀수 없음 --> 많은 것들을 "알빠? " 하는 방식입니다. --> 매우 불친절한 방식
과제니까 Fixed 방식 ) 보통 그냥 서비스 이용하는데 너무 긴 대기시간이면 , BTS급 콘서트 아니면 나 안해 하고 나갈 수도 있으니까 적당히 잡으세요. (5분 10분 줘요 ㅋㅋ)
현업에서는 Flexible하게 동적으로 평균 시간 계산 )
-
각 요청 별로 토큰이 서비스에서 퇴장할 시간 - 입장 가능한 시간
-
평균을 내서
-
한 사이클이 돌아가는 시간을 동적으로 변화시킬 수 있는데,
-
만약에 11번 유저까지 5분간 이용하다가 , 12번 이후부터는 2~3분 이용하게 바뀜
-
그럴 떄 어떻게 되까요? 앞에 있는 애들이랑 점점 입장 가능 시간이 겹치는 시간이 찾아오게 됩니다.
-
그래서 101번~120번 들어와서 하는데, 뒤에 있는 애들이 얘네랑 겹쳐서 ㄱ같은 시간에 이용할 수 있게 된다면?
-
FIFO 아니겠죠?
-
그래서 동적으로 하면 어떻게 FIFO 에 가깝게 처리할 수 있을까 고민해야한다.
'Blog > Education' 카테고리의 다른 글
대기열 Redis 이관 및 Cache Service 도입 (0) | 2024.08.01 |
---|---|
3주차 발제 정리 (0) | 2024.07.02 |
2주차 QNA & 멘토링 (0) | 2024.06.28 |
2주차 발제 정리 (0) | 2024.06.22 |
1주차 멘토링 (0) | 2024.06.20 |
댓글