[업무일지] 재실행 한 번에 두 배가 된 회수 대상
하루 한 번 도는 배치가 만든 레코드를 같은 날 운영자 수기 재실행이 그대로 다시 INSERT해서 2배가 됐습니다. 진입 경로가 공통으로 지나는 코어에 당일 생성분 가드를 넣고, 가드값과 DB 기본값을 상수 하나로 묶은 기록입니다.
하루 한 번 도는 배치가 만든 레코드를 같은 날 운영자 수기 재실행이 그대로 다시 INSERT해서 2배가 됐습니다. 진입 경로가 공통으로 지나는 코어에 당일 생성분 가드를 넣고, 가드값과 DB 기본값을 상수 하나로 묶은 기록입니다.
롤링 배포로 발화 시각을 놓친 스케줄이 재기동 직후 밀린 실행을 한꺼번에 몰아 돌리던 문제입니다. Quartz misfire 기본 정책이 원인이었고, 기본값을 DO NOTHING으로 바꾸면서 두 층을 고치고 한 축은 일부러 둔 기록입니다.
계약 서류 이미지 업로드에서 힙 OOM이 났는데 컨테이너는 죽지 않았습니다. 파일 크기는 검증했지만 디코딩된 픽셀 수를 보지 않은 게 원인이었고, 축소 디코딩과 세마포어 두 축으로 막은 기록입니다.
한 외부 연동 회수만 전면 중단됐는데 에러도 경보도 없었습니다. 공유 스레드풀의 corePoolSize가 컨슈머 수보다 작아 한 컨슈머가 스레드를 못 잡고 조용히 멈춘 starvation이었고, 큐 용량 때문에 maxPool은 애초에 도달 불가였습니다.
서비스마다 제각각이던 분산락을 @DistributedLock 하나로 통일한 기록입니다. 비정상 종료 시 5시간 남던 락을 Redisson Watchdog으로 30초로 줄였고, 그 과정에서 AOP 자기호출과 롤링 배포 split-brain에 발이 걸렸습니다.
활성 테이블 265개에서 12개를 추리고도 바로 DROP하지 않았습니다. RENAME과 2주 유예로 되돌릴 시간을 확보한 판단 기록입니다.