이벤트 스트림은 수신자 및 채널별 키로 다이제스트 배치로 롤업되며, 중복 제거, 컷오프 일정, 부분 실패 격리, 멱등 전송 토큰을 통해 중복 작업자가 동일한 다이제스트를 두 번 전달하거나 읽을 수 없는 집계를 조용히 누락하지 않도록 합니다.
패키지 상태: AI 지원 참조 패키지. 정적 패키지 검증은 통과했으나 구현 시나리오는 실행되지 않았으며 안정적 채택 전 인간 도메인 검토가 필요합니다.
결정
수신자 프로필이 다이제스트 모드를 선택할 경우, 대량 알림 이벤트는 즉시 전송하지 않고 수신자별 다이제스트 버퍼에 추가됩니다. 스케줄러는 프로필 정의 컷오프 시점에 버퍼를 닫고, 하나의 다이제스트 페이로드를 렌더링하며, 멱등 전송 토큰을 할당하고 채널 어댑터를 통해 발송합니다. send_pending 재시도는 성공하거나 최종 실패 상태가 될 때까지 제한된 루프를 따릅니다. 조용한 시간 정책은 수신자 오픈 윈도우까지 다이제스트 발송을 연기할 수 있습니다. max_buffer_events를 초과하는 오버플로우는 조용히 누락하지 않고 주간 버퍼로 넘겨집니다.
범위
- 버퍼링, 중복 제거 키, 컷오프 일정, 렌더링, 전송 멱등성, 재시도 루프, 조용한 시간 연기, 다이제스트 채널 전달 상태.
- 채택 프로필 내 이메일 일간/주간 다이제스트 및 인앱 다이제스트 요약.
- 빈 버퍼 억제: 기간 내 적합한 메시지가 없으면 수신자에게 메시지를 보내지 않음.
이 블록 외부
- 다이제스트 모드 외 실시간 트랜잭션 알림 전송.
- 템플릿 HTML 디자인 및 마케팅 수신 거부 준수 흐름(멱등 전송 기록 범위 밖).
- 조용한 시간 일정 정의(조용한 시간 블록 참조); 이 블록은 quiet_hours_respect 활성 시 연기 결과를 사용.
계약
- 각 다이제스트 전송 시도는 수신자, 채널, 컷오프 기간별 고유 전송 토큰을 포함하며, 동일 토큰으로 두 번째 발송 시 두 번째 가시 메시지를 생성하지 않음.
- 모든 공급자 발송은 하나의 전송 시도로 계산. 시도 남아있으면 일치하는 백오프와 함께 send_pending 재시도 상태 유지;
max_send_attempts실패 후에는 추가 발송 없이 failed 상태로 전환. - quiet_hours_respect가 true일 때 조용한 시간 내 발송은 즉시 공급자 전송 대신 quiet_hours_defer_action hold-until-open-then-send 사용.
- 오버플로우 정책 spill-to-weekly는 일간 버퍼 초과 이벤트를 주간 버퍼로 이동하며 감사 가능한 스필 기록 생성; 이벤트는 조용히 누락되지 않음.
- 이벤트는 활성 버퍼 창 내 프로필 정의 키로 중복 제거.
- 중복 제거 후 빈 버퍼는 발송하지 않고 skipped_empty 상태 기록.
- 다이제스트 상태 전환은 digest-state-machine.yaml을 따르며, 불법 전환 시 운영자에게 문제 상세 오류 반환.
구현 지침
- 소스가 최소 1회 이상 수집을 요구할 경우 소스 이벤트 확인 전에 버퍼를 내구성 있게 저장.
- 렌더링과 전송 분리, 렌더 출력 해시는 공급자 발송 전에 저장.
- quiet_hours_respect 활성 시 공급자 발송 전에 조용한 시간 평가 통합.
실패 처리 및 안전장치
- 공급자 타임아웃 시 전송 완료로 표시하지 않고 send_pending 상태와 재시도 일정 유지.
- 최종 실패한 다이제스트는 이후 재시도 시 중복 메시지 생성 없이 운영자에게 표시되며, 새 컷오프 기간이 시작되지 않는 한 유지.
검증 및 운영
- 테스트는 send_pending 재시도 루프, 최종 실패 경로, 조용한 시간 연기, spill-to-weekly, 전송 토큰 멱등성 검증.
- 메트릭은 버퍼 나이, send_pending 시도, 최종 실패율, 스필 볼륨 추적.
채택 가정
- example.yaml 및 digest-state-machine.yaml의 이름과 숫자 값은 채택 프로필이며 보편적 기본값 아님.
- 채택 팀이 이벤트 스키마, 다이제스트 템플릿, 컷오프 캘린더 정의.
참고
- 이 배치 및 전달 상태 계약에 외부 규범적 출처는 필요 없음. RFC 5322는 인터넷 메시지 형식을 규정하며 다이제스트 일정이나 재시도 의미론은 포함하지 않음.