피드로 돌아가기
The 10-Minute Race: Scaling the "Cancel Order" Button to 100K+ Requests Per Second
Dev.toDev.to
Backend

100K+ RPS 환경에서 Event-Driven 및 Timestamp 기반 설계로 취소 버튼 최적화

The 10-Minute Race: Scaling the "Cancel Order" Button to 100K+ Requests Per Second

Hitender Shekhawat2026년 5월 21일4intermediate

Context

초단기 배송 서비스의 '주문 취소' 버튼 노출 여부를 결정하기 위해 100,000+ RPS의 대규모 트래픽 처리 필요. 기존 Direct API 호출 방식은 Fulfillment 시스템의 DB Lock 및 전체 앱 크래시를 유발하는 구조적 한계 존재.

Technical Solution

  • Redis 기반 In-memory Cache를 활용한 Cancellation_Allowed_After 타임스탬프 사전 저장으로 연산 부하 최소화
  • 폴링 기반 타이머 대신 현재 시간과 타임스탬프 비교 연산으로 Read Path의 시간 복잡도 최적화
  • Kafka 메시지 브로커를 통한 Driver Arrived 이벤트 수신 및 Redis 상태 즉시 업데이트로 Write Path 효율화
  • WebSockets 기반 Persistent Pipeline을 구축하여 상태 변경 사항을 Chat UI에 실시간으로 Push 하는 구조 설계
  • 비즈니스 로직을 '사전 계산(Math)'과 '이벤트 기반 갱신(Event)'으로 분리하여 시스템 간 의존성 제거

Impact

  • 100,000+ RPS의 대규모 요청 처리 가능
  • 기존 Polling 방식 대비 95% 이상의 불필요한 리소스 낭비 제거
  • Redis 기반 sub-millisecond 단위의 빠른 조회 속도 확보

Key Takeaway

능동적인 상태 추적(Active Polling)을 지양하고, 타임스탬프 기반의 수동적 계산과 Event-Driven Push 구조를 결합하여 읽기 성능과 실시간성을 동시에 확보하는 설계 전략


1. 시간 기반 상태 변경 시 타이머 대신 타임스탬프를 저장하고 조회 시점에 비교하는가?

2. 빈번한 상태 확인 요청이 하위 시스템의 DB 부하로 이어지지 않도록 Cache 계층이 설계되었는가?

3. 실시간 업데이트가 필요한 UI에 대해 Polling 대신 WebSocket/SSE 등 Push 모델을 적용했는가?

4. 상태 변경의 트리거를 이벤트 기반(Kafka 등)으로 처리하여 시스템 간 결합도를 낮췄는가?

원문 읽기