SFTP 転送/処理で競合状態が発生することを心配する必要がありますか?

SFTP 転送/処理で競合状態が発生することを心配する必要がありますか?

シナリオ:

SFTP を使用して、2 つのシステム A と B 間でファイルを自動的に転送しています。

システム A は SFTP サーバーを実行します。システム A は定期的に (たとえば 1 分に 1 回) ローカル SFTP ディレクトリをポーリングして *.dat ファイルが存在するかどうかを確認し、見つかった場合はインポートして削除します。

システム B は *.dat ファイルを生成し、生成されると、その SFTP ホストに接続してアップロードすることで、システム A に送信します。

質問:

  1. システム B がファイルのアップロードを完了する前に、システム A がファイルを認識し、処理を開始する可能性はありますか? または、ネットワーク転送が完了するまでフォルダーにファイルを保存しないなど、SFTP が何らかの方法でこれを防ぐでしょうか?

  2. システム B が *.locked や *.part などの別のファイル名でアップロードし、ネットワーク転送が完了した後に *.dat に名前を変更することは合理的/推奨されますか? または、これを処理するより良い方法はありますか?

答え1

定義上は競合状態ではありませんが、部分的にアップロードされたファイルがシステム A によって読み取り用に開かれ、無効なデータが含まれる可能性があります。システム A は、ファイルの一貫性をチェックし、適切な場合は固定サイズをテストし、特定のファイル権限 (アップロード後に設定する) をテストし、いずれにしても条件が満たされない場合はファイルを開くのを延期し、次の反復でそれを実行します。

一時的なファイル名または場所にアップロードしてから、プログラムに適したフォルダ/拡張子に名前を変更/移動します。つまり、filename.part にアップロードしてから filename.dat に名前を変更するか、pending/filename.dat にアップロードしてから pending フォルダから移動します。これで、このような問題は解決します。UNIX/Linux および Windows システムでは、移動操作 (または名前変更操作) はアトミックであり、部分的なファイルが取得されることはありません。

これを処理するより良い方法はありません。ファイルが完全ではないこと、およびシステム間にプロセス間通信が設定されていないことをシステム A に伝える必要があります。オプションとしては、プログラムがファイルを開けないようにロック ファイルを使用する (後で削除する)、一時ファイルを使用する (その後、ファイルを適切な名前に変更/移動する)、または何らかの整合性チェックを実行する (おそらくリソースの無駄) などがあります。

また、これがどのくらいの頻度で発生するかに応じて、システム B からシステム A をトリガーすることも検討できます。99% の確率でそこにファイルがある場合は、既に提案されている方法 (ロックを使用) が最も効率的です。一方、たまにしかデータを見つけられない場合は、リソースの無駄になる可能性があります (長時間実行されるプログラムや cron トリガー プログラムが必要になります)。SFTP がある場合は、SSH アクセスがある可能性があります。このような場合は、システム間で証明書を設定し (パスワードが不要になるようにするには、ssh-copy-id を参照してください)、

ssh system_a.yourdomain.com 'プロセスファイル /home/user/data/*.dat'

関連情報