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