문제
발행·전송 뒤 상태 저장 전에 종료하면 같은 알림이 다시 전달될 수 있다.
unread도 첫 시도의 retry count 저장 전에 종료하면 같은 메시지로 다시 증가할 수 있다.
기존 eventId·worker claim·FCM 전송 원장만으로 전체 수신자·SSE fan-out의 중복을 막지는 못한다.
남은 경계
할 일
- 기존
eventId·claim을 유지하고 record key·envelope 버전의 전환 방식을 정한다.
- 기존 FCM 원장과 겹치지 않게 event inbox·수신자별 fan-out·lease·보존·재처리를 설계한다.
- SSE·FCM payload의 안정적 ID와 클라이언트 중복 제거 계약을 맞춘다.
- unread 변경을 멱등하게 만들고 외부 성공 뒤 상태 저장 실패의 at-least-once 경계를 명시한다.
검증
- 변경한 mute·수신자 선택·계정 소유권 판단만 핵심 비즈니스 단위 테스트로 확인한다.
- claim·inbox·원장·outbox 상태 전이는 정적으로 확인한다.
- 발행·전송·commit 사이 중단, 여러 poller 경합과 unread 수렴은 수동 운영 점검한다.
완료 조건
- 재전달이 완료한 fan-out을 새 논리 알림으로 만들지 않고 unread를 중복 증가시키지 않는다.
- SSE·FCM 수신 측 중복 제거와 외부 재전달 경계가 명시되어 있다.