1

実稼働環境には 4 つの Biztalk サーバーがあります。sendport は、受信メッセージを 1 つのテキスト ファイルに書き込むように構成されています。このポートは、1 日に数千のメッセージを受信します。そのため、複数のホスト インスタンスが一度にファイルに書き込もうとすると、1 つのインスタンスが完全なレコードの書き込みを完了する前に、別のインスタンスが新しいレコードの書き込みを開始し、データがファイル全体に散らばってしまいます。

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

3

...1 つのインスタンスが完全なレコードの書き込みを完了する前に、別のインスタンスが新しいレコードの書き込みを開始し、データがファイル全体に散らばっています。

この問題を解決するにはどうすればよいですか?

簡単な方法は、1 つのホスト インスタンスのみを使用してファイルにデータを書き込むことですが、スロットリングの問題が発生する可能性があります。または、ファイル アダプタの [書き込み時にキャッシュを許可する] オプションを使用して調べることもできます。これにより、いくつかの改善が得られる場合があります。

しかし、あなたのアプローチは間違っていると思います。4つの別々の完全に切断されたプロセス(4つのサーバー間で)が確実に単一のファイルに追加されるとは期待できません-順番に。

したがって、このソリューションの再構築を検討する必要があると思います。

  1. 各メッセージが受信されるたびに、「未処理」フラグを使用してメッセージの内容をデータベース テーブルに書き込みます (単純な INSERT)。4 つのホスト インスタンスが互いにつまずくことを恐れることなく、確実にデータを SQL に打ち込むことができます。
  2. スケジュールされた時間に、その SQL テーブルで未処理としてマークされているすべてのレコードを BizTalk で抽出します (ここでは WCF-SQL アダプターが役立ちます)。レコードをポーリングしたら、それらを「処理中」としてマークします。
  3. これで、現在未処理のすべてのレコード (SQL から取得したもの) を含む単一のメッセージが作成されます。単一 (または複数) のホスト インスタンスを使用して、メッセージをディスクに書き込み、各レコードを 1 回の書き込みでファイルに追加します。ここで重要なのは、1 つのファイルに 1 つのメッセージのみを書き込むことです
  4. 書き込みが成功した場合は、SQL テーブル内の各レコードを「処理済み」フラグで更新して、次のポーリングで再度取得されないようにします。

同時に行われるポーリング-書き込み-更新プロセスが 1 つだけになるように、この部分のシングルトン オーケストレーションを検討することをお勧めします。

于 2013-08-08T13:04:07.757 に答える
0

ファイルの代わりにデータベース システムに移動できます。それは非常に単純な解決策であり、非常に効率的でもあります。そのようにしたくない場合は、アプリケーション内にファイル ロックまたはセマフォを実装して、新しいスレッドが他のスレッドが書き込みを完了するまで待機するようにする必要があります。

于 2013-08-05T10:56:57.107 に答える