ソースデータ。
私たちはインターネットでサッカーの試合を放送しています。 訪問者:通常の日5,000-10,000、試合日100,000-150,000。
データセンター内
- ApacheとPCPがハードウェアロードバランサーを介して外部に投稿された5つのWebサーバー
- 2つのMemkeshプール:Webサービスからのセッションおよびデータ用
問題
訪問者が大量に流入すると、memkeshへの多数の呼び出しによりローカルネットワークが過負荷になります。 悪化要因 :100Mbitネットワーク、同じサーバー上の両方のプール。
解決策
- 一連の試合の終了後、最大1Gbのネットワーク拡張
- キャッシュストレージ時間の増加(一時的な手段として)
- スマートセッションテクノロジーの使用
今日は、負荷を軽減するために使用したスマートセッションのテクノロジーについて説明します。
技術の本質は何ですか
- 本当に必要でない場合は、セッションを作成しません。
- 変更されていない場合、リポジトリ内のセッションは更新されません。
実際、私たちのサイトは有料です。たとえ1日あたり150,000のユニークなサイトがあったとしても、本当に喜んで支払う人はほとんどいません。 訪問者はおよそ次のように配布されます。
- 70%-ゴーカー。 彼らはメインページを開き、必要なものではないことに気づき、閉じました。 つまり、SEOはうまく機能しましたが、私たちは急いでいます。
- 28%-ファン。 お金はありませんが、試合中の情報(ゴール、置換)をフォローするために私たちのサイトを使用してください。 情報も利用できるため、通常は登録されません。
- 2%-登録して支払いを行うことで、本当に試合を見ます。
実装
memkeshを使用するため、セッションの標準機能をオーバーロードし、後者をmemkeshに格納できるSessionオブジェクトが既にあります。 さらに、次のことを行います。
- セッションが要求されないときに作成されないように、ifにグローバルsession_start()を配置します。
if(!empty($_COOKIE[ini_get('session.name')]))
session_start();
- ユーザーがログインしている場所で、セッションの開始を追加します。ここではすでに必要であるためです。
if(empty($_COOKIE[ini_get('session.name')]))
session_start();
- そして最後に、オブジェクトに追加の静的変数を作成し、読み取り時と書き込み時にセッションの内容を保存します。最初に次のチェックを行います。
if(self::$data !== null && self::$data == $currentData)
return strlen($currentData);
出来上がり、ネットワークの負荷も部分的には軽減されます。 その後、一部のブロックのキャッシュをローカルWebサーバーに切り替え、訪問者の減少を安全に待つことができた後、ネットワーク帯域幅を増やしました。
コメントを歓迎します。
UPD :投稿のポイントは、私がどれだけクールかを示すことではありませんが、PCPには些細なことがあり、それらに注意を払うのをやめ、時には考えすぎてパフォーマンスに影響しないこともあります。