SHOW HN: Cloudflare Workers용 사용량 서킷 브레이커
Source: Hacker News
배경
저는 3mins.news(https://3mins.news)를 운영하고 있습니다. 이 서비스는 전적으로 Cloudflare Workers 위에 구축된 AI 뉴스 집계기입니다. 백엔드에는 몇 분마다 실행되는 10개 이상의 크론 트리거가 있습니다 — RSS 가져오기, 기사 클러스터링, LLM 호출, 이메일 전송 등.
문제점
Workers 유료 플랜에는 월간 제한이 강제됩니다(1천만 요청, 100만 KV 쓰기, 100만 큐 작업 등). “제한에 도달하면 일시 정지”와 같은 내장 기능이 없으며, Cloudflare는 초과 사용량에 대해 바로 청구를 시작합니다. KV 쓰기는 초과분당 $5 / M이 부과되므로, 재시도 루프 버그가 금방 비용을 폭증시킬 수 있습니다.
AWS는 예산 알림을 제공하지만, 이는 수동적인 알림에 불과합니다 — 이메일을 확인할 때쯤이면 이미 손해가 발생한 뒤입니다. 저는 능동적인, 애플리케이션 수준의 자체 보호가 필요했습니다.
해결책: 내부 지향 서킷 브레이커
다운스트림 장애를 방어하는(Hystrix 패턴) 것이 아니라, 제 자신의 리소스 사용량을 모니터링하고 한도에 도달하기 전에 우아하게 감소시키는 내부 지향 서킷 브레이커를 만들었습니다.
핵심 설계 결정
-
리소스별 임계값
- Workers 요청($0.30 / M 초과) – 80 %에서 경고만 발생.
- KV 쓰기($5 / M 초과) – 90 %에서 브레이커가 트립.
- 모든 리소스가 동일하게 위험한 것은 아니므로, 일부는 경고 전용(
trip = null)으로 설정합니다.
-
히스테리시스
90 %에서 트립하고, 85 %에서 복구합니다. 5 % 차이는 진동을 방지합니다 — 그렇지 않으면 매 체크 사이클마다 트립·복구가 반복됩니다. -
모니터링 실패 시 안전장치
Cloudflare 사용량 API가 다운되면 “모두 정상”이라고 가정하지 않고 마지막 알려진 상태를 유지합니다. 모니터링 장애가 사용량 급증을 가릴 수 없게 합니다. -
알림 중복 제거
리소스별, 월별로 중복을 방지합니다. 그렇지 않으면 리소스가 80 %에 도달했을 때 남은 한 달 동안 약 8,600개의 동일한 이메일을 받게 됩니다.
구현
5분마다 시스템은 다음을 수행합니다:
- Cloudflare GraphQL API(요청, CPU, KV, 큐) 와 Observability Telemetry API(로그/트레이스)를 병렬로 조회합니다.
- 8가지 리소스 차원을 평가합니다.
- 결과 상태를 KV에 캐시합니다.
체크 사이에는 애플리케이션이 단일 KV 읽기만 수행하므로 사실상 비용이 들지 않습니다.
브레이커가 트립되면 모든 예약 작업이 건너뛰어집니다. 크론 트리거 자체는 여전히 실행되지만(멈출 수 없음), 첫 번째 동작으로 브레이커 상태를 확인하고 트립된 경우 바로 종료합니다.
결과
- 두 주간 운영 중.
- 월 초에 KV 읽기 급증(82 %)을 포착 — 경고 이메일 1통을 받았고, 원인을 조사·수정했으며, 트립 임계값에 도달하지 않았습니다.
적용 가능성
이 패턴은 어떤 계량형 서버리스 플랫폼(Lambda, Vercel, Supabase)이나 예산 상한이 있는 API(OpenAI, Twilio)에도 적용할 수 있습니다. 핵심 아이디어: 다운스트림 서비스의 오류율을 건강 신호로 보는 것처럼, 자신의 리소스 예산을 건강 신호로 취급합니다.
추가 읽을거리
구현 코드와 테스트가 포함된 전체 글쓰기:
Comments URL: