11강 / 20강
주문 큐 — 밀려드는 일을 순서대로 처리하기
선착순이 공정할까? 급한 주문은 어떻게 하지?
오전 10시, 타임세일이 시작됐습니다. 1분에 3,000건의 주문이 들어오는데, 서버는 1분에 800건밖에 처리하지 못합니다.
이때 선택지는 셋입니다.
- 거절한다 — "잠시 후 다시 시도해 주세요" (손님이 떠남)
- 기다리게 한다 — 대기열에 넣고 순서대로 처리 ✅
- 그냥 다 받는다 — 서버가 죽음 💀
정답은 두 번째, 큐(queue)입니다.
deque 는 앞뒤 모두 O(1). 리스트의 pop(0)은 O(n)이라 큐에 부적합합니다.
Python
브라우저에서 실행
같은 큐, 자료구조 하나 바꿨을 뿐인데.
Python
브라우저에서 실행
선착순이 항상 공정할까요?
이런 상황을 생각해 봅시다. 대기열에 이런 일들이 섞여 있습니다.
- 일반 주문 500건
- 결제 취소 요청 3건 — 늦으면 고객 항의가 폭발합니다
- 서버 상태 점검 1건 — 이게 늦으면 장애를 못 알아챕니다
선착순으로 하면 결제 취소가 500건 뒤에 처리됩니다. 그래서 필요한 것이 우선순위 큐(priority queue)예요.
우선순위 큐 = 힙. 급한 일이 새치기하되, 동점이면 선착순.
Python
브라우저에서 실행
🎮 주문 처리 대기열 시뮬레이터
주문 유입 속도와 서버 처리 속도를 조절해 보세요. FIFO와 우선순위 큐를 전환하면 급한 주문의 대기 시간이 얼마나 달라지는지 보입니다. 유입이 처리보다 빠르면 대기열이 폭발합니다 — 꼭 만들어 보세요.
큐가 알려 주는 것 — 대기열 길이는 최고의 지표
시스템 관리자에게 대기열 길이는 체온계입니다.
| 대기열 상태 | 의미 | 조치 |
|---|---|---|
| 0에 가깝게 유지 | 여유 있음 | 정상 |
| 오르내리지만 결국 0 | 순간 몰림을 잘 흡수 중 | 정상 |
| 계속 늘어남 | 처리 속도 < 유입 속도 | 🚨 처리기 증설 · 유입 제한(17강) |
| 꽉 차서 거절 발생 | 이미 장애 | 🚨 긴급 대응 |
"CPU 사용률 60%인데 서비스가 느려요"의 답이 대개 여기 있습니다. CPU가 아니라 큐를 보세요.
🤔 확인 문제
파이썬 리스트를 큐로 쓰면서
pop(0)을 쓰면 생기는 문제는?해설 리스트는 연속된 칸이라 앞을 빼면 전부 당겨야 합니다.
collections.deque를 쓰면 양끝 모두 O(1)이에요.🤔 확인 문제
우선순위 큐에 항목을
(우선순위, 순번, 내용) 형태로 넣는 이유는?해설 7강의 동점 처리와 같은 원리입니다. 순번이 없으면 같은 우선순위끼리의 순서가 보장되지 않고, 내용이 비교 불가능한 타입이면 오류도 납니다.
🤔 확인 문제
대기열 길이가 계속 늘어나기만 한다면 어떤 상태일까요?
해설 큐는 순간적인 몰림을 흡수할 뿐, 지속적인 초과 유입은 해결하지 못합니다. 처리기를 늘리거나 유입을 제한(17강 트래픽 제어)해야 해요.