我是否應該擔心 SFTP 傳輸/處理的競爭條件?

我是否應該擔心 SFTP 傳輸/處理的競爭條件?

設想:

我正在使用 SFTP 在兩個系統 A 和 B 之間自動傳輸檔案。

系統A運行SFTP伺服器。系統 A 將定期(例如每分鐘一次)輪詢其本地 SFTP 目錄是否存在 *.dat 文件,如果找到,則匯入並刪除它們。

系統 B 產生 *.dat 文件,生成後,透過連接到該 SFTP 主機並上傳將它們傳送到系統 A。

問題:

  1. 系統 A 是否有可能在系統 B 完成上傳檔案之前看到並開始處理檔案?或者 SFTP 會以某種方式阻止這種情況,例如在網路傳輸完成之前不將檔案存放在資料夾中?

  2. 系統 B 以其他檔案名稱(例如 *.locked 或 *.part)上傳,然後在網路傳輸完成後重新命名為 *.dat 是否合理/建議?或者有更好的方法來處理這個問題嗎?

答案1

根據定義,這不是競爭條件,但係統 A 會開啟部分上傳的檔案以供讀取,因此可能包含無效資料。系統 A 可以檢查文件的一致性,可以在適當的情況下測試固定大小,可以測試某些文件權限(您在上傳後設定),並且在任何情況下,如果不滿足條件,則推遲打開文件,在下一次迭代中這樣做。

我會上傳到臨時檔案名稱或位置,然後重新命名/移動到程式的正確資料夾/副檔名。即上傳到filename.part,然後重新命名為filename.dat,或上傳到pending/filename.dat,然後移出pending 資料夾。這將解決任何此類問題。在 UNIX/Linux 和 Windows 系統上,移動操作(或重新命名操作)將是原子操作,您永遠不會獲得部分檔案。

沒有真正更好的方法來處理這個問題。您需要通知系統 A 檔案不完整,且系統之間沒有建立任何進程間通訊。您的選擇是使用鎖定檔案來阻止您的程式開啟該檔案(然後將其刪除),使用臨時檔案(然後將檔案重新命名/移動到適當的名稱),或進行某種完整性檢查(這可能是浪費資源)。

您也可以考慮,根據這種情況發生的頻率,從系統 B 觸發系統 A。另一方面,如果您只是偶爾查找數據,則可能會浪費資源(並且需要長時間運行或 cron 觸發的程式)。如果您有 SFTP,則可能有 SSH 存取權限。在這種情況下,請在系統之間設定憑證(為了避免需要密碼,請參閱 ssh-copy-id)並執行一些修改版本

ssh system_a.yourdomain.com 'processfile /home/user/data/*.dat'

相關內容