次のことを行うノードサーバーがあります。
外部サーバーに URL のリストがあり、それを URLServer と呼びます。ユーザーが NODE サーバーにアクセスすると、ノード サーバーは URLServer にリクエストを送信し、たとえば 20 個の URL のリストを取得します。20 個の URL を取得したらすぐに、ノード サーバーにこれらの URL のそれぞれのタイトルを取得させたいと考えています。つまり、URL を取得して DOM を作成し、タイトルを抽出します。他のデータも取得します。したがって、これはそれが行われなければならない方法です。それが完了したら、URL のタイトルと URL を内部メモリやデータベースに保存したいと考えています。そのため、URL キャッシュとタイトル キャッシュがあります (常に URL を取得する必要はありません)。
私はこのようなものを持っています: if(URL-cache is empty) URLServer から URL を取得し、これらの URL をキャッシュします
次に、これらの URL のそれぞれをチェックして、タイトルがキャッシュにあるかどうかを確認したいので、各 URL に対して、title-cache[URL] の場合、そうでない場合はサイトを取得し、DOM を作成し、タイトルとその他のデータを抽出してキャッシュします。
これは 1 人のユーザーにはうまく機能しますが、サーバーに大きな負荷をかけようとすると、サーバーがハングします。サーバーがハングする理由は次のとおりです。
ユーザー 1 の要求 - キャッシュを空にする - URL を取得し、完了したら URL のコンテンツを取得します ユーザー 2 の要求 - ユーザー 1 の要求がまだ完了していないため、このユーザーにはキャッシュがまだ空に見えます!!! したがって、ユーザー 2 は、URL とそれぞれのコンテンツのフェッチを再度強制します。ユーザー 3 のリクエスト - ユーザー 1 とユーザー 2 のリクエストがまだ完了していないため、同じ問題が発生します...
したがって、取得する必要がある 10 個の URL があると仮定すると、URL ごとに 1 つずつ 10 個の接続を開いてからデータをキャッシュする代わりに、20 人のユーザーがまったく同時にサーバーにアクセスしている場合、200 個の接続を開くことになります (各ユーザー10 接続を開きます)。
ユーザー X (X>1) がこれらのイベントを発生させないようにするにはどうすればよいですか? 基本的に、サーバーにゲートを閉じて、すべてのユーザーにキャッシュが読み込まれるまで待機するように依頼し、キャッシュが読み込まれたらゲートを開くようにしたいのですが、これを行う方法はありますか?