WEBBOOK CHAPTER

WAR 배포, 밤에 깨지 않게: 29장 공유 파일·SFTP·배치·cron의 숨은 쓰기를 찾는다

29장 공유 파일·SFTP·배치·cron의 숨은 쓰기를 찾는다

레거시 웹은 HTTP 요청만 처리하지 않는다. 특정 폴더의 CSV를 읽고, SFTP로 정산 파일을 보내고, 새벽 cron이 같은 DB를 수정한다. WAR만 복제하면 배치가 인스턴스 수만큼 중복 실행될 수 있다.

파일 연계는 incoming, processing, done, failed 상태를 디렉터리와 메타데이터로 구분한다. 같은 파일 시스템에서 원자적 rename으로 소유권을 넘기고, 파일 크기가 더 이상 변하지 않는지 확인한다. 네트워크 파일 시스템에서는 원자성·잠금 의미가 다를 수 있어 실제 저장소에서 검증한다.


partner_20260809_001.csv.part  # 전송 중
partner_20260809_001.csv       # 완료 후 rename
처리 key: partner + business-date + sequence + content-hash

cron, Spring scheduler, DB job, WAS timer가 같은 일을 중복 수행하지 않는지 전체 목록을 만든다. 다중 인스턴스에서는 leader election, DB lock, 전용 batch worker 중 하나를 명시하고 lock 만료와 재시도 정책을 시험한다. PID 파일만으로 분산 중복을 막을 수 있다고 가정하지 않는다.

실습 29 중복 배치 사고

node-a와 node-b가 같은 정산 파일을 동시에 발견한 fixture를 만든다. 한 노드만 processing 상태를 획득하고, 다른 노드는 처리 결과를 조회해야 한다. 첫 노드가 중간에 죽으면 lock 만료 뒤 재개하되 이미 반영된 DB 쓰기를 멱등 key로 중복 생성하지 않는다.