0

Webファーム内の複数のサーバー間でアクセスできるファイルをディスクに保存しています。このファイルは、データベースのデータ変更に基づいて必要に応じて更新されます。このファイルのURIといくつかのデータベーステーブルに基づくいくつかのハッシュを含む行を格納するデータベーステーブルがあります。ハッシュがそれぞれのテーブルと一致しない場合は、ファイルを再生成し、新しい行を挿入する必要があります。

1つのクライアントだけがこのファイルを再生成して行を挿入するようにするにはどうすればよいですか?

最も簡単ですが最悪の解決策(ロックのため)は次のとおりです。

BEGIN TRANSACTION
SELECT ROW FROM TABLE (lock the table for the remainder of the transaction)
IF ROW IS OUT OF DATE:
    REGENERATE FILE
    INSERT ROW INTO TABLE
DO SOME STUFF WITH FILE (30s)
COMMIT TRANSACTION

ただし、複数のクライアントがこのコードを実行する場合、「DO SOME STUFF WITH FILE」の処理中は、後続のすべてのクライアントが長時間待機します。

これを処理するためのより良い方法はありますか?コミット前にファイルを処理する方法を変更して、ファイルを高速化するのではないでしょうか。私はこれに数日間困惑しています。

4

2 に答える 2

2

ファイル処理を非同期で行う必要があるようです。そのため、ファイルプロセスがスピンオフされ、トランザクションがタイムリーに完了します。これを行うにはいくつかの方法がありますが、最も簡単な方法は、「do stuffwithfile」を「テーブルThis_File_Needs_To_Be_Updatedにレコードを挿入し、そのテーブルの各レコードを更新するジョブを数分ごとに実行する」に置き換えることです。またはここに、その場でジョブを生成するコードがあります。または、StackOverflowでこの質問を参照してください。

于 2012-06-10T16:33:58.167 に答える
1

答えは、ファイルレベルの処理の詳細によって異なります。

データベースとファイルの操作を入れ替えるだけでは、ファイルが破損したり、待機中にビジーウェイトが発生したりするリスクがあります(ファイルを開く精度と、同時オープンが拒否された場合のコードの動作によって異なります)。ビジー待機は、スループット(またはその他の)の観点からデータベースロックを待機するよりも間違いなく悪いでしょう。

ファイル処理に本当に時間がかかり、リクエストのキューイングが頻繁に発生する場合、唯一の解決策は、より強力なハードウェアを追加するか、ファイルレベルの処理を最適化することです。

たとえば、ファイルがデータベース内のデータのみを反映している場合は、ファイルをまったく更新せずに、データベース内のデータに基づいてコンテンツを定期的に再生成するバックグラウンドプロセスを使用する必要があります。ファイルを読み取る人が古いデータを受け取らないようにするバージョン管理を追加する必要がある場合があります。URLが指すファイルの名前が毎回新しい場合は、要求が新しいファイルに対する応答をGET習慣的に受信しないようにするエラーハンドラーが必要になる場合があります。404

于 2012-06-10T16:20:49.963 に答える