외부 에이전트가 주기적으로 업로드 한 파일을 안정적으로 처리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/622392

문제

매우 일반적인 시나리오입니다. 일부 프로세스는 30 분마다 서버에 파일을 삭제하려고합니다. 간단 해요? 글쎄, 나는 이것이 잘못 될 수있는 많은 방법을 생각할 수 있습니다.

예를 들어, 파일을 처리하는 데 30 분 미만이 걸릴 수 있으므로 이전 파일을 수행하기 전에 새 파일이 도착할 수 있습니다. 소스 시스템이 아직 처리중인 파일을 덮어 쓰는 것을 원하지 않습니다.

반면에 파일이 크기 때문에 업로드를 마치는 데 몇 분이 걸립니다. 부분 파일 처리를 시작하고 싶지 않습니다. 파일은 FTP 또는 SFTP (내 선호도)로 변환되므로 OS 레벨 잠금은 옵션이 아닙니다.

마지막으로 파일 중 하나를 수동으로 검사하거나 디버깅을 위해 파일을 다시 검사하거나 재 처리 해야하는 경우 파일을 잠시 동안 유지해야합니다.

파일 업로드, 파일 이름을 교환, 데이터 스탬프 사용, "표시기"파일을 터치하여 동기화를 지원하는 등의 임시 접근 방식이 많이 보였습니다. 내가 아직 보지 못한 것은 동시성, 일관성 및 완전성을 다루는 파일을 처리하기위한 포괄적 인 "알고리즘"입니다.

그래서 저는 여기서 군중의 지혜를 활용하고 싶습니다. 배치 데이터 파일을 저글링하는 방탄 방법을 본 사람이 있으므로 너무 일찍 처리되지 않았고, 완료 전에 덮어 쓰지 않았으며, 처리 후 안전하게 보관하십시오.

도움이 되었습니까?

해결책

열쇠는 초기 저글링을하는 것입니다. 배상 끝. 발신자가해야 할 모든 것은 다음과 같습니다.

  1. 고유 한 파일 이름으로 파일을 저장하십시오.
  2. 파일이 전송 되 자마자 EG라는 서브 디렉토리로 이동하십시오. completed.

단일 수신기 프로세스 만 있다고 가정하면 모든 수신기가해야 할 일이 다음과 같습니다.

  1. 주기적으로 스캔하십시오 completed 모든 파일에 대한 디렉토리.
  2. 파일이 나타나 자마자 completed, EG라는 서브 디렉토리로 이동하십시오 processed, 거기에서 작업을 시작하십시오.
  3. 완료되면 선택적으로 삭제합니다.

모든 제정신 파일 시스템에서 파일 이동은 동일한 파일 시스템/볼륨 내에서 발생하면 원자입니다. 따라서 인종 조건은 없습니다.

다중 수신기

처리가 전달되는 파일 사이의 기간보다 더 오래 걸릴 수있는 경우 여러 수신기 프로세스가없는 한 백 로그를 구축합니다. 그렇다면 다중 수용자 케이스를 처리하는 방법은 무엇입니까?

단순 : 각 수신기 프로세스는 이전과 같이 정확히 작동합니다. 핵심은 파일을 processed ~ 전에 작업 작업 : 그 사실과 동일한 파일 시스템 파일 이동이 원자력이라는 사실은 여러 수신기가 동일한 파일을 보더라도 completed 그리고 그것을 움직이려고 노력하면 하나만 성공할 것입니다. 당신이해야 할 일은 반환 값을 확인하는 것입니다. rename(), 또는 귀하가 호출하는 모든 OS 호출을 수행하는 데 사용하고 성공한 경우 처리를 진행합니다. 이동이 실패하면 다른 수신기가 먼저 도착 했으므로 돌아가서 스캔합니다. completed 디렉토리 다시.

다른 팁

OS가 지원하는 경우 파일 시스템 후크를 사용하여 파일 작업을 열고 닫습니다. 같은 것 다즈코. 다른 운영 체제는 Anoter Way의 파일 운영에 대해 알려줄 수 있습니다 (예 : Novell Open Enterprise Server) 읽다 에포크 중에 수정 된 파일 목록.

Linux에서는 Inotify 서브 시스템 또는 Inotify-Tools 패키지의 유틸리티를 사용할 수 있음을 깨달았습니다.

파일 전송은 시스템 통합의 고전 중 하나입니다. 나는 당신을 얻는 것이 좋습니다 엔터프라이즈 통합 패턴 이 질문에 대한 자신의 답변을 구축하려면 예약하십시오. 어느 정도까지 답은 엔드 포인트 구현 및 파일 전송에 사용하는 기술과 플랫폼에 따라 다릅니다. 그것은 매우 포괄적 인 실행 가능한 패턴의 컬렉션이며 상당히 잘 작성되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top