ADR-003 쿨다운/dedup 상태 = Redis SET NX PX (신호 단위)

Status

Accepted (2026-07-03)

Context

동일 알람 신호(엔드포인트 + source + severity)는 15분간 재알림을 억제해야 한다(FR-7). 억제 판정은 LLM 호출 에 이뤄져야 비용·레이턴시를 아낀다(PRD 문제정의). ⑦ 다중 인스턴스 확장을 고려해야 한다.

Decision

Redis SET key value NX PX 900000으로 신호 단위 쿨다운을 구현한다. 키: alerting:cooldown:{env}:{endpoint}:{source}:{severity}. 획득 성공=쿨다운 진입(발송 진행), 실패=쿨다운 중(억제). TTL 15분.

Alternatives

  • DB 유니크 제약 + 시각 비교 — TTL 자동만료 없음(정리 배치 필요), 억제 판정에 DB 왕복.
  • 인메모리 캐시(Caffeine) — ⑦ 다중 인스턴스에서 인스턴스별 상태 분리 → 중복 발송.

Rationale

  • 원자적 dedup(SET NX) — 동시 동일 신호에서 한 인스턴스만 획득.
  • TTL 자동 만료 — 별도 정리 불필요.
  • Redis 기설치(spring-boot-starter-data-redis), RedisDistributedLock 등 선례.
  • dedup 키가 “신호”라 LLM 호출 전에 판정(FR-7 의도).

Consequences

  • 쿨다운 키 계약은 INFRA-01(private-redis-implementer)이 문서로 확정.
  • AlertCooldownRepository interface(domain) + AlertCooldownRepositoryImpl(infra, RedisTemplate).
  • 멱등 키 = 쿨다운 신호 키 — 규칙 엔진 재발신·내부 재호출이 15분 창에서 첫 건만 통과.