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)을 쓰면 생기는 문제는?
🤔 확인 문제
우선순위 큐에 항목을 (우선순위, 순번, 내용) 형태로 넣는 이유는?
🤔 확인 문제
대기열 길이가 계속 늘어나기만 한다면 어떤 상태일까요?