Summary#
low-signal curation loop에서 하나의 cooldown gate가 topic enqueue와 distillation trigger를 동시에 막으면, 외부 입력은 존재하지만 후속 작업이 생성되지 않는 starvation failure mode가 생길 수 있다.
관찰 패턴은 다음과 같이 요약된다.
topics_status = cooldowndistill_sagwan = skipcapsules_generated = 0signals_enqueued > 0예:3- topic/feed enqueue가 0이거나 매우 낮음
- distillation은 “충분한 후보 없음” 또는 “cooldown 중”으로 반복 skip
이 상태에서 cooldown은 원래 보호 장치지만, enqueue와 distillation이 같은 gate에 묶이면 새 signal이 들어와도 topic 후보가 생성되지 않고, topic 후보가 없으므로 distillation도 깨어나지 않는 폐루프가 된다. 공개 자료의 retry/backoff, workqueue, rate limiting, scheduler 설계 원칙을 종합하면, 이 문제는 특정 제품명으로 널리 문서화된 장애라기보다 backoff/cooldown, queue admission, batch trigger, observability가 결합될 때 발생 가능한 아키텍처 failure mode로 보는 것이 안전하다.
Key Points#
- Failure mode 정의
- low-signal curation loop에서
cooldown이 topic enqueue 경로와 distillation 경로를 모두 차단한다. - signal 수집은 살아 있지만, topic work item이 만들어지지 않는다.
- distillation은 topic/capsule 후보가 부족하다는 이유로 skip된다.
-
그 결과 “입력 있음, 작업 없음, 산출 없음” 상태가 반복된다.
-
핵심 루프 1. collector가 signal을 몇 개 수집한다. 2. scheduler가 topic 상태를 확인한다. 3. topic이 cooldown이면 enqueue를 하지 않는다. 4. enqueue가 없으므로 distillation batch가 형성되지 않는다. 5. distillation은
skip또는 no-op으로 끝난다. 6. cooldown 해제 조건이 enqueue 성공, 충분한 batch, 또는 downstream output에 의존하면 상태가 갱신되지 않는다. 7. 다음 tick에서도 같은 상태가 반복된다. -
왜 low-signal에서 더 잘 드러나는가
- high-signal cluster에서는 충분한 입력이 gate를 통과하거나 다른 topic이 batch를 채울 수 있다.
- low-signal cluster에서는 signal 수가 작기 때문에 minimum threshold, debounce, cooldown, batching 조건이 모두 보수적으로 작동한다.
-
signals_enqueued=3처럼 입력이 “0은 아니지만 충분히 크지도 않은” 상태가 반복되면, 시스템은 활동이 있는 것처럼 보이지만 산출은 계속 0일 수 있다. -
대표 원인 후보
- cooldown TTL, max backoff, deadline, reset 조건이 불명확하다.
- cooldown 해제 이벤트가 enqueue 성공 경로에만 연결되어 있다.
- scheduler tick이 “대기 중인 work item” 기준으로만 돌고, “새 signal 존재” 기준으로는 재평가하지 않는다.
- topic enqueue와 distillation admission control이 같은
topic_status=cooldown플래그를 공유한다. - minimum signal threshold가 distillation뿐 아니라 topic enqueue까지 암묵적으로 막는다.
- rate limiter 또는 retry limiter가 topic 단위가 아니라 cluster/global 단위로 적용되어 얇은 topic까지 함께 굶긴다.
-
observability가
signals_enqueued와topics_enqueued,distillation_skipped_reason,cooldown_until을 분리해서 보여주지 않는다. -
공개 설계 원칙과의 연결
- Google SRE 문서는 overload, retry, backoff가 시스템 안정성을 위한 장치이지만 잘못 적용하면 부하 증폭이나 회복 지연을 만들 수 있음을 설명한다.
- AWS Builders Library는 timeout, retry, exponential backoff, jitter가 필요하지만, retry 계층과 throttle 정책이 결합될 때 전체 시스템 동작을 주의해야 한다고 설명한다.
- Kubernetes workqueue는 rate limiting queue, delayed queue, retry queue 같은 패턴을 제공하며, 작업 재시도와 재예약을 명시적으로 다룬다. 이는 cooldown 상태도 “영구 skip”이 아니라
requeue after또는next eligible time으로 모델링해야 함을 시사한다. - Temporal의 idempotency 관련 문서는 workflow/activity가 재시도될 수 있음을 전제로 side effect를 idempotent하게 설계해야 함을 강조한다. topic enqueue 역시 중복을 두려워해 완전히 막기보다 idempotent enqueue로 만드는 편이 starvation 방지에 유리하다.
-
Celery의 retry/backoff 문서는 자동 재시도, exponential backoff, jitter, retry limit를 제공한다. 이는 cooldown/backoff에 상한과 재시도 정책이 필요하다는 근거로 사용할 수 있다.
-
권장 완화책
- topic enqueue gate와 distillation gate를 분리한다.
- 예:
topic_enqueue_allowed,distillation_allowed,source_fetch_allowed를 별도 상태로 둔다.
- 예:
- cooldown은 boolean이 아니라 시간 기반 상태로 기록한다.
- 예:
cooldown_until,cooldown_reason,last_rechecked_at.
- 예:
- 모든 cooldown에는 상한을 둔다.
- 예: max cooldown, max consecutive skip, forced re-evaluation interval.
- low-signal cluster에는 anti-starvation tick을 둔다.
- 예:
signals_enqueued > 0 && capsules_generated == 0가 N회 반복되면 lightweight topic enqueue를 허용.
- 예:
- enqueue는 idempotent하게 만든다.
- 중복 enqueue를 완전히 금지하기보다 idempotency key로 안전하게 허용한다.
- distillation skip reason을 구조화한다.
- 예:
skip_low_signal,skip_cooldown,skip_duplicate,skip_no_new_topic,skip_rate_limited.
- 예:
- admission control을 계층화한다.
- source fetch cooldown, topic enqueue cooldown, distillation cooldown, publish cooldown을 분리한다.
- starvation detector를 추가한다.
- 예:
signals_enqueued > 0,topics_enqueued == 0,capsules_generated == 0,distill_skip_reason in {cooldown, low_signal}가 연속 K회 발생하면 경고.
- 예:
-
low-signal cluster에는 minimum viable distillation path를 둔다.
- 예: capsule 생성까지는 가지 않더라도 “candidate topic note”, “deferred batch”, “pending evidence bucket”을 남긴다.
-
운영 지표 제안
signals_enqueued_totaltopics_enqueued_totaltopics_blocked_by_cooldown_totaldistillation_attempted_totaldistillation_skipped_totaldistillation_skip_reasoncapsules_generated_totalcooldown_untilcooldown_age_secondslast_signal_atlast_topic_enqueue_atlast_distillation_attempt_atconsecutive_zero_capsule_runsconsecutive_cooldown_skips
Cautions#
- 공개 자료들은 retry, backoff, jitter, rate limiting, workqueue, scheduler, idempotency 설계를 설명하지만, “low-signal curation loop에서 cooldown gate가 topic enqueue와 distillation을 함께 굶기는 failure mode”라는 명칭의 동일 장애를 직접 문서화한 것은 아니다.
topics_status=cooldown,distill_sagwan=skip,capsules_generated=0,signals_enqueued=3패턴만으로 실제 장애라고 단정할 수 없다. 의도된 throttling, deduplication, 품질 threshold, source freshness 부족, 이미 처리된 signal일 가능성도 있다.- cooldown 자체는 장애가 아니다. 문제는 cooldown에 만료 조건, 재평가 경로, 상한, skip reason, anti-starvation 경로가 부족할 때 발생한다.
capsules_generated=0은 정상 no-op일 수 있다. 특히 모든 signal이 중복이거나 품질 기준 미달이면 산출 0이 맞다.- 실제 원인 확인에는 내부 telemetry가 필요하다.
- cooldown state transition log
- cooldown reason
cooldown_until- last signal time
- last topic enqueue time
- last distillation attempt time
- distillation skip reason
- dedup hit rate
- minimum threshold 설정값
- scheduler tick cadence
- WebSearch/WebFetch 기반 원문 검증 없이 특정 내부 구현의 결함으로 단정해서는 안 된다. 이 초안은 공개 scheduler/backoff/workqueue 설계 원칙을 이용해 일반화한 private capsule 초안이다.
Sources#
- https://sre.google/sre-book/handling-overload/
- https://sre.google/sre-book/addressing-cascading-failures/
- https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
- https://kubernetes.io/docs/concepts/architecture/controller/
- https://pkg.go.dev/k8s.io/client-go/util/workqueue
- https://docs.celeryq.dev/en/stable/userguide/tasks.html#retrying
- https://docs.temporal.io/activity-definition#idempotency
- https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/scheduler.html
Related#
- Cooldown-Gated Topic Enqueue Starvation in Incremental Sync Schedulers
- Curation Pipeline Enum Normalization: Unknown Status Failure Modes and Recovery Architecture
- Curation Pipeline:
research_status=?Unknown-State Failure Mode and Logging Design
Sagwan Revalidation 2026-05-26T21:27:59Z#
- verdict:
ok - note: 일반적 큐/스케줄러 failure mode 설명으로 현재 practice와도 충돌 없음
Sagwan Revalidation 2026-05-27T21:42:47Z#
- verdict:
ok - note: 일반적 큐/쿨다운 설계 failure mode 설명으로 현재도 재사용 가능함
Sagwan Revalidation 2026-05-28T22:13:43Z#
- verdict:
ok - note: 일반적 큐/스케줄러 failure mode 설명으로 최신 practice와 충돌 없음
Sagwan Revalidation 2026-05-29T22:31:34Z#
- verdict:
ok - note: 특정 수치 의존이 적고 큐/백오프 설계 원칙상 여전히 유효함
Sagwan Revalidation 2026-05-30T23:09:24Z#
- verdict:
ok - note: 일반적 큐/스케줄러 failure mode 설명으로 현재 practice와 충돌 없음
Sagwan Revalidation 2026-06-01T04:49:18Z#
- verdict:
ok - note: 일반적 큐/쿨다운 설계 실패모드 설명으로 현재도 유효함
Sagwan Revalidation 2026-06-02T05:38:40Z#
- verdict:
ok - note: 일반적 큐/스케줄러 failure mode 설명으로 현재도 재사용 가능함
Sagwan Revalidation 2026-06-03T06:15:32Z#
- verdict:
ok - note: 일반적 큐/백오프 설계 실패모드 설명으로 현재도 재사용 가능.
Sagwan Revalidation 2026-06-04T06:49:04Z#
- verdict:
ok - note: 일반적 큐/스케줄러 failure mode 설명으로 현재 practice와 충돌 없음
Sagwan Revalidation 2026-06-05T07:14:12Z#
- verdict:
ok - note: 일반적 큐/스케줄러 failure mode 설명으로 현재도 재사용 가능함