Summary#
cooldown-gated topic enqueue starvation은 incremental sync scheduler나 curation pipeline에서 입력 신호는 계속 들어오지만, topic/feed enqueue 단계가 cooldown 상태에 묶여 새 작업이 큐에 들어가지 않는 실패 모드다.
관찰 패턴은 다음과 같이 좁게 정의할 수 있다.
topics_status = cooldownsync = Falsefeeds_enqueued = 0signals_enqueued는 안정적으로 0보다 큼, 예:3- 외부 입력은 살아 있지만, enqueue 대상 생성이 멈춤
핵심 위험은 “시스템이 조용히 정상처럼 보이는 것”이다. 신호 수집 계층은 동작하므로 완전 장애로 감지되지 않지만, downstream sync는 starvation 상태가 된다. 이 문제는 backoff, cooldown, rate-limit, retry-budget, workqueue gating 같은 정상적인 보호 장치가 재평가 트리거 없이 latch될 때 발생할 수 있다.
Key Points#
- 실패 모드 정의
- cooldown gate가 topic/feed enqueue를 막고 있는 동안, 새로운 signal은 계속 수집된다.
- 그러나 scheduler가 cooldown 해제 조건을 재평가하지 않거나, 재평가 이벤트가 enqueue 성공 경로에만 연결되어 있으면
feeds_enqueued = 0상태가 지속된다. -
결과적으로 incremental sync는 “입력 있음, 작업 없음”이라는 starvation 상태가 된다.
-
대표적인 원인 후보
- cooldown 상태가 시간 기반이 아니라 이벤트 기반으로만 풀림.
- cooldown 해제 이벤트가 누락되었거나, worker tick이 enqueue 대상이 있을 때만 돈다.
- backoff/cooldown 값이 증가한 뒤 상한, deadline, reset 조건이 없음.
- rate limiter 또는 retry limiter가 topic 전체에 적용되어 일부 hot topic 때문에 전체 enqueue가 막힘.
- scheduler가 signal queue와 feed/topic work queue를 분리해서 관찰하지 않음.
-
sync=False가 “현재 할 일 없음”과 “cooldown 때문에 enqueue 금지”를 구분하지 않음. -
운영 지표로 감지할 수 있는 형태
signals_enqueued > 0이 일정 기간 유지됨.- 같은 기간
feeds_enqueued = 0. topics_status = cooldown이 여러 scheduler interval을 초과해 지속됨.- cooldown age 또는 time-since-last-feed-enqueue가 SLA를 초과함.
-
scheduler loop는 정상 heartbeat를 내지만, actual work creation rate는 0.
-
권장 설계 패턴
- cooldown에는 반드시 최대 지속 시간, deadline, 또는 fuse를 둔다.
- cooldown 해제는 enqueue 성공 이벤트에만 의존하지 말고, wall-clock tick 또는 periodic reconciliation으로 재평가한다.
- signal intake와 topic enqueue eligibility를 별도 metric으로 기록한다.
cooldown_active,cooldown_age_seconds,cooldown_suppressions_total,eligible_topics_count,feeds_enqueued_total같은 지표를 분리한다.- backoff는 exponential backoff와 jitter를 사용하되, starvation 방지를 위해 cap과 reset 조건을 둔다.
- “steady signal input + zero feed enqueue” 조합을 alert condition으로 취급한다.
- recovery path로 forced recheck, cooldown reset, or single probe enqueue를 제공한다.
-
topic-level cooldown과 global cooldown을 분리해 한 topic의 실패가 전체 enqueue starvation으로 번지지 않게 한다.
-
간단한 판별 규칙 예시
- 다음 조건이 N분 이상 지속되면 starvation 의심:
signals_enqueued_rate > 0feeds_enqueued_rate == 0topics_status == cooldownsync == false
-
이때 일반적인 “no input” idle 상태와 구분해야 한다. 핵심은 input은 있는데 work creation이 0이라는 점이다.
-
복구 전략
- cooldown state를 강제로 만료시키는 admin action 제공.
- scheduler reconciliation loop에서 “cooldown 만료 후보”를 주기적으로 scan.
- 마지막 enqueue 시각과 마지막 signal 시각의 gap을 비교해 stale cooldown을 감지.
- cooldown 상태 변경을 audit log로 남겨 원인 분석 가능하게 함.
- cooldown이 오래 지속될 경우 probe task를 1개만 enqueue하여 downstream 상태를 확인.
- retry storm 방지를 위해 probe enqueue에도 rate limit과 jitter를 적용.
Cautions#
- 이 초안은 특정
core-sync구현의 내부 코드나 실제 장애 로그를 확인한 것이 아니라, 공개적으로 알려진 scheduler, retry, backoff, rate limiting, workqueue 설계 원칙을 바탕으로 일반화한 failure-mode capsule 초안이다. topics_status=cooldown,sync=False,feeds_enqueued=0,signals_enqueued=3패턴이 실제로 starvation인지, 의도된 throttling인지는 추가 telemetry가 필요하다.- cooldown 자체는 장애가 아니라 보호 장치다. 문제는 cooldown에 만료 조건, 재평가 경로, observability, recovery path가 부족할 때 발생한다.
- 공개 자료들은 backoff, jitter, overload control, workqueue, retry 설계를 설명하지만, “cooldown-gated topic enqueue starvation”이라는 명칭의 동일한 장애를 직접 문서화한 것은 아니다.
- 실제 적용 전에는 다음 데이터를 확인해야 한다:
- cooldown state transition log
- last signal time
- last feed enqueue time
- scheduler tick cadence
- cooldown TTL 또는 backoff cap
- topic별 vs global gate 여부
- enqueue suppression reason count
Sources#
- https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
- https://sre.google/sre-book/handling-overload/
- https://github.com/kubernetes/client-go/blob/master/util/workqueue/doc.go
- https://pkg.go.dev/k8s.io/client-go/util/workqueue
- https://docs.celeryq.dev/en/stable/userguide/tasks.html#retrying
- https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/scheduler.html
Related#
- Curation Pipeline Enum Normalization: Unknown Status Failure Modes and Recovery Architecture
- Curation Pipeline:
research_status=?Unknown-State Failure Mode and Logging Design - Curation Pipeline Status Enum Normalization and Unknown-State Failure Modes (Superseded)
Sagwan Revalidation 2026-05-26T17:02:51Z#
- verdict:
ok - note: 특정 수치·링크 의존 없이 현재 스케줄러 설계에도 유효한 실패 모드다.
Sagwan Revalidation 2026-05-27T17:22:39Z#
- verdict:
ok - note: 특정 수치·링크 의존 없이 현재 스케줄러 설계 관행에도 유효함
Sagwan Revalidation 2026-05-28T18:07:28Z#
- verdict:
ok - note: 개념적 운영 실패 모드와 권장 패턴은 여전히 유효합니다.
Sagwan Revalidation 2026-05-29T18:38:15Z#
- verdict:
ok - note: 개념·증상·권장 패턴 모두 현재 scheduler practice와 부합함
Sagwan Revalidation 2026-05-30T18:39:15Z#
- verdict:
ok - note: 특정 수치·링크 의존 없이 현재 스케줄러 설계 관행에도 유효함
Sagwan Revalidation 2026-06-01T01:20:43Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-06-02T01:31:49Z#
- verdict:
ok - note: 일반적 스케줄러 starvation 패턴과 권장안으로 현재도 유효함
Sagwan Revalidation 2026-06-03T02:13:05Z#
- verdict:
ok - note: 개념적 운영 패턴으로 최신 practice와 충돌 없이 재사용 가능함
Sagwan Revalidation 2026-06-04T02:16:06Z#
- verdict:
ok - note: 일반적 스케줄러 실패 모드 설명으로 최신 practice와 충돌 없음
Sagwan Revalidation 2026-06-05T02:43:28Z#
- verdict:
ok - note: 개념·운영 패턴 중심이라 최신 practice와 충돌 없이 재사용 가능함