5

複数のサーバーを使用して、ラウンドロビン方式で負荷分散された着信Webリクエストを処理します。解決方法がわからない問題が発生しました。

AJAX(qqFileUploader)を使用して、ファイルをアップロードしています。デフォルトでは、/tmpフォルダーに移動します。これで問題ありません。問題は、そのファイルを取得しようとすると、その取得要求が、アップロードしたファイルがない行の次のサーバーによって処理されることです。リクエストを何度も繰り返すと、最終的にはファイルが保存されていた元のサーバーに到達し(ラウンドロビン負荷分散を介して)、ファイルを開くことができます。明らかに、それは良い解決策ではありません。

基本的にコードは次のとおりです:http: //jsfiddle.net/Ap27Z/。簡潔にするために、その一部を削除しました。アップローダーオブジェクトがPHPファイルを呼び出してファイルのアップロードを行い、ファイルのアップロードが完了した後、スクリプトに対して別のAJAX呼び出しが行われて.csvファイルが処理されることがわかります。これは、ラウンドロビンでプロセスが失われている場所です。

ここで、メモリへのファイルのアップロードに関連するSOに関するいくつかの質問を読みましたが、現在は本質的に実行可能ではないようです。ファイルをアップロードして同じリクエスト内ですべてを処理するために使用できる別のオプションはありますか?

4

2 に答える 2

6

このタイプの問題の古典的な解決策は、ロードバランサーでスティッキーセッションを使用することです。小さな問題を修正するためにセットアップ全体を変更することになるため、これは適切な解決策ではない可能性があります。

各マシンにサブドメインプレフィックスを追加することをお勧めします。たとえば、アップロードはwww.example.comに移動し、各サーバーには追加のサブドメインwww1.example.com、www2.example.comが割り当てられ、常にそのサーバーに直接渡されます。ラウンドロビンDNSではなく。

成功結果の一部として、負荷分散された名前ではなく、正確なサーバーを指すサーバー名を返すことができます。その後、アップロードされたデータを参照する後続のすべてのAjax呼び出しは、サーバー固有のドメイン名ではなく、そのサーバー固有のドメイン名を使用します。一般的な負荷分散ドメイン名。

ファイルをアップロードして同じリクエスト内ですべてを処理するために使用できる別のオプションはありますか?

もちろん?データのPOSTを処理するコードは、必要な処理を実行できます。

于 2012-07-18T14:28:33.760 に答える
2

あなたの問題には(少なくとも)2つの解決策があります:

  1. 負荷分散を変更します

「スティッキーセッション」とも呼ばれるセッションアフィニティをサポートする負荷分散プロキシがいくつかあります。つまり、ユーザーはセッション内で常に同じサーバーを取得します。

このように動作できる2つのプログラムは、HAProxySOに関するここでの関連質問)とcustonモジュールを備えたnginxチュートリアルはこちら)です。

  1. あなたはファイルの場所を偶然見つけます

もう1つの選択肢は、保存されているファイルの場所を、すべてのサーバーが同じ場所からアクセスできる場所に変更することです。これは、たとえば、NFSマウントまたはデータベース(ファイルがBLOBとして保存されている)の場合があります。このように、すべてのサーバーがファイルにアクセスできるため、どのサーバーがリクエストを処理するかは問題ではありません。

于 2012-07-18T14:31:39.980 に答える