핵심 구현 포인트
1. 원자적 선점 메커니즘
tryMarkProcessing()
으로 단건 원자적 선점
- UPDATE 쿼리 결과(1 또는 0)로 선점 성공 판정
- 다중 워커 환경에서도 중복 발행 방지
2. 트랜잭션 전략
- 메인 트랜잭션: 비즈니스 로직 + Outbox INSERT
- REQUIRES_NEW: 상태 전이는 즉시 커밋
- After Commit: Spring 이벤트로 발행 트리거
- 비즈니스 예외는 커밋 (noRollbackFor)
3. 스케줄러 운영
- PENDING: 10초마다 16건씩 처리
- FAILED: 30초마다 재시도 (최대 3회)
- PROCESSING: 5분 타임아웃에 대해 10분마다 복구
- 정리: 30일(PUBLISHED), 90일(DLQ)
4. 지수 백오프
- 기본 10초 × 2^(retry_count-1)
- 최대 300초 제한
- next_retry_at 필드에 계산값 저장
5. 특수 정책