시퀀스 발송 — 정리/최적화 로직 전수분석

2026-06-17 · 앱린다(send-grid-test) · PostgreSQL 18.3 / Redis 8.6.1 · 실서버(beta) 실측 기반

결론 먼저 — 최근 적용한 인덱스 속도 개선이 오래된 미발송 건을 한꺼번에 발송하는 문제는 없습니다. 발송 가능한 stale 건(7일+ 과거)이 실측상 0건이고, 최근 발송 지연도 최대 7.6시간(당일 내 throttle)입니다. 발견된 정리 누락들은 모두 발송 정합성과 무관한 데이터 위생 이슈이며, 이번 변경과 무관한 기존 항목입니다.

발송 정합성 — 안전 확인 (실측)

검증 항목실측값의미
active 하 stale sendable (7일+ 과거 pending)0빨라진 로더가 flush할 오래된 발송 건 자체가 없음안전
최근 3시간 발송 max lag7.6h전부 당일 내 throttle 지연 — stale flush 아님안전
비active enrollment 하 pending/deferred11,457로더가 e.status='active' 요구 → 속도와 무관하게 영구 제외(발송X)발송X
로더 결과 (인덱스 ON vs 강제 seqscan)24 = 24접근경로만 변경, 결과 동일 → 미발송·중복발송 불가능동일

발견된 정리 로직 누락 (pre-existing · 발송정합성 아님)

항목beta 실측영향위험도
terminal(stopped/bounced/unsub) enrollment 잔존 pending 미skip11,457*step_executions 테이블 bloat (발송 안 됨)
deferred 무한연기 가드 부재 (미래 7일+ 밀림)180소수 발송 지연 가능
processing 30분+ stuck530분 주기 reconciler가 자동복구 (이미 커버)
awaiting_enrichment 타임아웃 부재0enrichment API 장애 시만 (현 피해자 0)이론
NULL account active enrollment0발송불가 고아 (현 피해자 0)
orphan 정리 cron 미자동화 (1회성 스크립트 의존)수동 운영 의존
발송 워커 staleness 가드 부재현재 무해(stale 0). 미래 백로그 형성 시 대비 필요예방
* recompute_sequence_pending_workse.status IN ('active','paused')만 카운트 → stopped/bounced/unsubscribed 잔존 pending은 has_pending_work·완료판정에 영향 없음. 순수 테이블 bloat 이슈.

잘 작동하는 정리 로직 (확인됨)

최적화 누락 (현 규모 무해 · 대규모 시 재검토)

권장 Action (별도 트랙 · 발송 로직 아님 = 저위험)

우선항목방법
terminal 전이 시 pending skip 누락enrollment가 stopped/bounced/unsubscribed로 갈 때도 skipRemainingExecutions 호출(현재 completed만). dual-DB 검증 후 패치
deferred 무한연기 방지deferral_count 또는 max-attempts → 초과 시 failed/skip
orphan 정리 자동화1회성 스크립트 → daily cron worker
예방staleness 가드send-email에 scheduledAt < NOW()-7d → skip (미래 백로그 대비)