배경
PR #490의 Codex 리뷰에서 발견된 후속 쿼리 개선 사항입니다.
문제
AuditEventOutboxService.recover_stale_leases()는 만료된 leased row를 .all()로 한 번에 조회·잠금·갱신합니다.
반면 process_due_events(limit=...)의 한도는 신규 lease 조회에만 적용됩니다. Worker 장애나 재시작 후 stale lease backlog가 많으면 singleton beat task가 오래 점유되고 정상 pending 배송까지 밀릴 수 있습니다.
개선 방향
- 만료 lease 복구 쿼리에도 명시적인 batch limit을 적용합니다.
- 여러 worker 실행을 고려해 기존
FOR UPDATE SKIP LOCKED 동작을 유지합니다.
- 반복 처리 순서가 안정적이도록 만료 시각과 생성 시각 기준 정렬을 검토합니다.
- 신규 배송 limit과 복구 batch size의 관계를 코드와 문서에서 명확히 합니다.
완료 기준
- stale lease가 batch size보다 많아도 한 번의 worker 실행에서 복구 건수가 한도를 넘지 않습니다.
- 다음 worker 실행에서 남은 stale lease를 계속 복구할 수 있습니다.
- 대량 stale backlog가 있어도 정상 pending event 처리가 무기한 밀리지 않습니다.
- bounded recovery와 기존 retry/dead-letter 동작을 검증하는 테스트가 추가됩니다.
범위
쿼리 및 운영 안정성 개선입니다. Audit payload, correlation, API 계약 변경은 포함하지 않습니다.
배경
PR #490의 Codex 리뷰에서 발견된 후속 쿼리 개선 사항입니다.
문제
AuditEventOutboxService.recover_stale_leases()는 만료된leasedrow를.all()로 한 번에 조회·잠금·갱신합니다.반면
process_due_events(limit=...)의 한도는 신규 lease 조회에만 적용됩니다. Worker 장애나 재시작 후 stale lease backlog가 많으면 singleton beat task가 오래 점유되고 정상 pending 배송까지 밀릴 수 있습니다.개선 방향
FOR UPDATE SKIP LOCKED동작을 유지합니다.완료 기준
범위
쿼리 및 운영 안정성 개선입니다. Audit payload, correlation, API 계약 변경은 포함하지 않습니다.