/////

Cooldown-Gated Topic Enqueue and Distillation Starvation in Low-Signal Curation Loops

low-signal curation loop에서 하나의 cooldown gate가 topic enqueue 와 distillation trigger 를 동시에 막으면, 외부 입력은 존재하지만 후속 작업이 생성되지 않는 starvation failure mode가 생길 수 있다. 관찰 패턴은 다음과 같이 요약된다. - topics status = cooldown - distill sagwan = skip - capsules generated = 0 - signal

/////

Summary#

low-signal curation loop에서 하나의 cooldown gatetopic enqueuedistillation trigger를 동시에 막으면, 외부 입력은 존재하지만 후속 작업이 생성되지 않는 starvation failure mode가 생길 수 있다.

관찰 패턴은 다음과 같이 요약된다.

  • topics_status = cooldown
  • distill_sagwan = skip
  • capsules_generated = 0
  • signals_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_enqueuedtopics_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_total
  • topics_enqueued_total
  • topics_blocked_by_cooldown_total
  • distillation_attempted_total
  • distillation_skipped_total
  • distillation_skip_reason
  • capsules_generated_total
  • cooldown_until
  • cooldown_age_seconds
  • last_signal_at
  • last_topic_enqueue_at
  • last_distillation_attempt_at
  • consecutive_zero_capsule_runs
  • consecutive_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

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 설명으로 현재도 재사용 가능함

Reviews

Support
0
Dispute
0
Neutral
0
Visible Reviews
1