次のタスクのベストプラクティスは何でしょうか。
私はリモートノードでプログラムを起動します。これにより、その後、パブリックにアクセス可能なフォルダーに新しいファイルが生成されます。リモートノードで新しいファイルが作成されるたびに、このファイルを別のノード、たとえばローカルノード/クライアントにすぐに転送する必要があります。
ノードは、研究室のLANで接続された2つの通常のWindows 10デスクトップコンピューターであることに注意してください。
リモートディレクトリを定期的に監視することはできましたが、データが利用可能になるとすぐにデータが転送されなくなりました。適用できる原則や設計パターンがすでにあるのか、それとも独自のクライアント/サーバー通信を設定する必要があるのかと思います。この質問はプログラミング言語に依存しないと思いますが、C#を使用しています。
ファイルが存在することだけでなく、ファイルが完全であり、コピーする準備ができていることを知る必要があります。そうでなければ、不完全なファイルをコピーする危険性はありませんか?
ファイルの終わりマーカーのように、各ファイルに完全性の表示を含めることができます。 (しかし、ファイル作成者が不完全なファイルで死んだ場合はどうなりますか?)
別のファイルの存在を終了マーカーとして使用できます。ファイルが作成されると、マーカーファイルが変更され、変更時刻が更新されます。ローカルシステムは、エンドマーカーファイルより古いすべてのファイルを自由にコピーできます。
リモートシステムからローカルシステムへの他の形式のシグナリングを使用して、ローカルシステムに完了したファイルを取得するように要求できます。
使用しているテクノロジによっては、フォルダーを監視する方法がいくつかあるため、それは実際には問題になりません。また、ファイルの必要性を判断する必要もあります。すぐに必要ですか?特定の時間にそれらが必要ですか?これは、フォルダーの読み取り戦略に役立ちます。
ただし、ここでの主な問題は、データの整合性です。ファイルがすぐに必要だと判断した場合、どのようにしてファイルが完全であると判断しますか?後でそれらが必要になった場合でも、それらが正常に転送され、破損していないことをどのようにして確認しますか?ここでの一般的な戦略は、必要な情報を含む追加のファイルを作成することです。おそらく転送されたファイル名とハッシュ値です。送信前にハッシュ値を取得し、ファイルを取得した後に再計算します。両方の値を比較し、それらが一致する場合、転送が成功し、プロセスを続行できることがわかります。
このシナリオでは、必要な実際のファイルを探す必要はなく、ハッシュデータを含むファイルだけを探す必要があります。元のファイルの後に、最後に転送する必要があります。これらは.txt、.js、.xmlのいずれでもかまいませんが、サイズが小さく、迅速な転送と信頼性の高いプロセスが保証されます。
ノードで実行されるプログラムを変更できる場合は、これをPOST宛先のHTTPサーバーへのコンテンツに変更できます。
プログラムを変更することはできないが、その出力をstdoutにリダイレクトすることができる場合は、リダイレクトされたstdoutストリームでプログラムを起動し、それを宛先(ここでもHTTP POST)に転送するラッパープログラムを作成できます。
個人的には、あなたが説明したことに対して機能する主なソフトウェアエンジニアリングの原則は、車輪を再発明することではないと思います。実際に機能する可能性のある詳細はわかりませんが、これを機能させるためにこれに入れる必要のあるロジックの最小量について検討します。
たとえば、私の意見では、これらのコンピューター間でファイルを転送するコードを書いてしまうと、2つのWindows 10 PC間でネットワークフォルダー共有を簡単にセットアップできるため、間違っています。したがって、多くの場合、変更を監視し、共有ファイルをローカルドライブにローカルにコピーするコードを記述する必要があるようです。正確に何をしているのかに応じて、共有フォルダーを数秒ごとに更新し、通常のWindowsコピーコマンドを使用してファイルのコンテンツをローカルにコピーするプログラムを作成する必要がある場合があります。その時点に達している場合、これが自動的に実行される既製のソフトウェアがおそらく存在しますが、リアルタイムの明らかなソフトウェアは知りません。 「リアルタイムフォルダ同期」を検索すると、間違いなく可能なオプションがあります。
ここでは、基本的に2つの方法を使用できます。 1つ目は、リモートノードが転送を開始するノードになることです。そのノードは、ファイルを送信する準備ができたときに正確にわかるためです。
2番目のオプションは、基本的にローカルノードがリモートノードに接続され、ノードが完了したというメッセージを待つ最初のオプションのフォローアップです。ある意味では最初のオプションと同じですが、ローカルノードがファイルの移動を実行するノードになります。
FTPディレクトリにファイルが到着したときにトリガーされる、同様のことをしなければなりませんでした。
少し前のことですが、私たちはincronを使用したと思います
https://www.howtoforge.com/tutorial/trigger-commands-on-file-or-directory-changes-with-incron/
.netにはSystem.IO.FileSystemWatcherがあり、Windows PCで同様の効果を得ることができます。