AWS 비용 3,000달러 폭탄 맞은 Node.js 폴링 루프 실수
스타트업의 AWS 비용이 수 주 만에 200달러에서 3,000달러로 급증하며 비용 문제(Cost Issue) 발생
원인은 빈 큐(Empty Queue)에서 백오프(Backoff) 없는 폴링 루프(Polling Loop)로 인한 무한 데이터베이스 호출(Database Query)이었음
수정 후 지연 시간(Latency)은 정상이었으나, 지속적인 유휴 작업(Continuous Idle Work)으로 인한 과도한 인프라 부하(Infrastructure Load)가 문제였음
비용 모니터링(Cost Monitoring)의 중요성과 '할 일이 없을 때 코드가 무엇을 하는가?'라는 질문의 필요성을 강조함
무한 폴링 루프(Infinite Polling Loop)의 작동 방식
본문에서 제시된 코드는 `getJobs()` 함수가 빈 배열을 반환할 경우, 지연 없이 즉시 `processQueue()`를 재귀 호출하여 무한 루프를 생성함.
문제점: `setTimeout`이나 `setInterval`과 같은 지연 메커니즘(Delay Mechanism) 부재로 인해, 작업이 없을 때도 지속적으로 데이터베이스 쿼리(Database Query)를 발생시킴.
각 반복마다 네트워크 트래픽(Network Traffic), CPU 사용량(CPU Usage), 로깅 오버헤드(Logging Overhead)가 발생하며, 이는 개별적으로는 미미하나 수십만 번 반복 시 상당한 비용으로 이어짐.
결과적으로 시스템은 기술적으로는 정상 작동하나, 유휴 상태(Idle State)에서의 비효율적인 리소스 소모로 인해 비용이 급증함.
비용 버그(Cost Bug)의 특성과 탐지
이 사례는 비용 버그(Cost Bug)가 일반적인 오류와 달리 시스템 충돌이나 예외를 발생시키지 않는다는 점을 명확히 보여줌.
탐지: CPU, 메모리, 오류율 등 일반적인 성능 지표(Performance Metrics)는 정상 범위를 유지했으나, AWS 비용 청구서(AWS Billing Statement)가 유일한 경고 신호였음.
원인: 유휴 트래픽(Idle Traffic) 최적화 실패로, 시스템이 바쁠 때보다 오히려 한가할 때 더 많은 리소스를 소모하는 비효율 발생.
해결책: 비용 모니터링(Cost Monitoring)을 성능 모니터링과 병행하고, 코드 리뷰 시 '할 일이 없을 때의 동작(Behavior When Idle)'을 반드시 질문하는 습관이 중요함.
폴링(Polling) 방식의 대안: 이벤트 기반 아키텍처(Event-Driven Architecture)
폴링 방식의 근본적인 문제점은 주기적으로 상태를 확인해야 한다는 점이며, 이를 해결하기 위해 이벤트 기반 아키텍처(Event-Driven Architecture) 도입이 효과적임.
메시지 큐(Message Queue) 활용: RabbitMQ, Kafka, SQS 등 메시지 큐 시스템을 사용하면, 작업이 발생했을 때만 이벤트(Event)를 발행하고 소비자는 이를 구독하여 처리함.
장점: 실시간 처리(Real-time Processing)가 가능하며, 작업이 없을 때는 불필요한 리소스 소모가 없어 비용 효율성(Cost Efficiency)이 높음.
구현: `processQueue` 함수 대신, 작업이 큐에 추가될 때 트리거되는 이벤트 리스너(Event Listener) 또는 웹훅(Webhook)을 구현하는 방식이 권장됨.
백오프 전략(Backoff Strategy)의 중요성
폴링 기반 시스템에서 작업이 없을 때 발생하는 과도한 부하를 줄이기 위해 적절한 백오프 전략(Backoff Strategy) 구현은 필수적임.
지수 백오프(Exponential Backoff): 실패 시 재시도 간격을 기하급수적으로 늘리는 방식으로, AWS SDK 등에서 널리 사용됨. (예: 5초 → 10초 → 20초 → ...)
고정 지연(Fixed Delay): 본문에서 제시된 `setTimeout(resolve, 5000)`과 같이, 작업이 없을 경우 일정 시간(예: 5초) 동안 대기 후 다시 시도하는 방식.
목표: 시스템 안정성(System Stability) 확보 및 리소스 낭비(Resource Waste) 방지를 통해 불필요한 비용 발생을 억제함.