SFTP 전송/처리 시 경합 상태에 대해 걱정해야 합니까?

SFTP 전송/처리 시 경합 상태에 대해 걱정해야 합니까?

대본:

SFTP를 사용하여 두 시스템 A와 B 간에 자동으로 파일을 전송하고 있습니다.

시스템 A는 SFTP 서버를 실행합니다. 시스템 A는 주기적으로(예를 들어 1분에 한 번) 로컬 SFTP 디렉토리에 *.dat 파일이 있는지 폴링하고 파일이 발견되면 가져오고 삭제합니다.

시스템 B는 *.dat 파일을 생성하고, 파일이 생성되면 해당 SFTP 호스트에 연결하고 업로드하여 시스템 A로 보냅니다.

질문:

  1. 시스템 B가 파일 업로드를 완료하기 전에 시스템 A가 파일을 보고 처리를 시작할 수 있습니까? 아니면 SFTP는 네트워크 전송이 완료될 때까지 폴더에 파일을 저장하지 않는 등 어떻게든 이를 방지할 것입니까?

  2. 시스템 B가 *.locked 또는 *.part와 같은 다른 파일 이름으로 업로드한 후 네트워크 전송이 완료된 후 *.dat로 이름을 바꾸는 것이 합리적/권장됩니까? 아니면 이것을 처리하는 더 좋은 방법이 있습니까?

답변1

정의상 경쟁 조건은 아니지만 부분적으로 업로드된 파일이 시스템 A에서 읽기 위해 열리므로 잘못된 데이터가 포함될 수 있습니다. 시스템 A는 파일의 일관성을 확인하고, 적절한 경우 고정 크기를 테스트하고, 특정 파일 권한(업로드 후 설정)을 테스트하고, 어떤 경우에도 조건이 충족되지 않는 경우 파일 열기를 연기할 수 있습니다. 다음 반복에서는 그렇게 합니다.

임시 파일 이름이나 위치에 업로드한 다음 프로그램의 올바른 폴더/확장자로 이름을 바꾸거나 이동합니다. 즉, filename.part에 업로드한 다음 filename.dat로 이름을 바꾸거나 보류/filename.dat에 업로드한 다음 보류 중인 폴더 밖으로 이동합니다. 그러면 그러한 문제가 해결될 것입니다. UNIX/Linux 및 Windows 시스템에서 이동 작업(또는 이름 바꾸기 작업)은 원자성이므로 부분 파일을 얻을 수 없습니다.

이를 처리하는 더 좋은 방법은 없습니다. 파일이 완전하지 않고 시스템 간에 프로세스 간 통신이 설정되지 않았음을 시스템 A에 전달해야 합니다. 옵션은 잠금 파일을 사용하여 프로그램이 파일을 열지 못하도록 방지하고(나중에 파일을 제거함), 임시 파일을 사용하고(그런 다음 파일 이름을 바꾸거나 적절한 이름으로 이동), 일종의 무결성 검사를 수행하는 것입니다. 아마도 자원 낭비일 것입니다).

발생 빈도에 따라 시스템 B에서 시스템 A를 트리거하는 것을 고려할 수도 있습니다. 99%의 시간 동안 파일이 있는 경우 이미 제안한 방식(잠금 포함)이 아마도 가장 효율적일 것입니다. 반면, 가끔씩만 데이터를 찾는다면 리소스 낭비일 수 있습니다(장기 실행 프로그램이나 cron 트리거 프로그램이 필요함). SFTP가 있으면 SSH 액세스가 가능할 수 있습니다. 이러한 경우 시스템 간에 인증서를 설정하고(비밀번호가 필요하지 않도록 하려면 ssh-copy-id 참조) 다음의 일부 수정된 버전을 실행하십시오.

SSH system_a.yourdomain.com '프로세스 파일 /home/user/data/*.dat'

관련 정보