ミドルウェアキャッシュ - キャッシュ・アーキテクチャの実装(上)

ミドルウェアキャッシュ - キャッシュ・アーキテクチャの実装(上)

序文

瞬き、2019を超えています。私は、ミドルウェア、アーキテクチャに従って、それぞれ、いくつかの一般的な問題と解決策を示していることを願っています。一方で、特定の汎用性を持つこれらの問題と解決策。一方、それは一般的な面接の質問を考えることができます。

私は、あらゆる規模の企業を持っていたことがために、独自の経験に基づいた意見のいくつかについてお話したいと思います。

  • それは、ほとんどの中小企業や仕事の面接のためであれば、これらの問題は、印象に残って少しすることができます。小さいため、同社の技術のこれらの問題に非常に(小さな企業は、多くの場合など、事業を推進し、製品の機能を追求)少ないチャンスよりも大切な、またはされていません。
  • それはこれらの問題と解決策を十分に認識する仕事やオーディションに中堅企業の大多数のためである場合。中堅企業なので、これらの問題は、多かれ少なかれ満たされている、あるいは緊急に対処する必要があります。
  • それは大企業であれば、私たちだけではなく問題と解決策を知っている必要があります。どちらも私たちは、なぜ宇宙を強化するかどうか、既存のプロジェクトに適用されるべきか、解決され、そのようなAの問題がある理由を理解する必要があります。大企業では、一方ではその内部には、多くの場合から学ぶことができる自己開発フレームワーク、プログラムの唯一の本質、イデオロギーや他のフレームワークを使用しているため、一方のオープンソースのフレームワークを使用して、これらの大企業の不足は、プログラムの一般的な考え方の理解の欠如ません人々。

上記の缶がそれを理解していない場合、我々は、機能と考えるのは非機能の追求から、両方を追求することができます。最も基本的な要件は、その機能を達成することであるように、簡単な方法を書くように、それは、その非機能の一定の追求(など、パフォーマンス、スケーラビリティ、セキュリティ、など)が続いています。あまりにも、同社の技術開発のために、ビューをズーム、またはより厳しいです。

チャンスの後、同社および同社の技術上の私の見解についての話に専念ブログを書きます。

トピックバック、次、私はそれに関連するミドルウェア問題と解決方法を詳しく説明し始めたそう。

アウトライン

キャッシュの理解

言及したキャッシュミドルウェア関連の問題と解決策以来、私たちは、最初にこのキャッシュについて話す必要があります。

もともと私は一例としてキャッシュしたかったが、それは、例えば、子供のために、メモリだと思いました。

たとえば、私たちは今、単一のゲーム、簡単に複数のコンピュータ・メモリ(16G)よりも、多くの場合、非常に大きな容量(Gの数十、またはGの何百もの)、遊びます。そして、明らかにコンピュータゲームを実行すると、ゲーム全体をメモリにファイルすることはできません。しかし、ファイルがハード・ディスク上にある場合には、十分ではありません明らかに、再び読み取るために必要な時間は、ハードディスクの読み取りと書き込み速度の、そしてゲームはしばしばケイトン、ロードすること(多くのゲームファイルのカテゴリーとして、ハードディスクは常にシーケンシャルリードと書くことができないので)そして、遅いです。それでは、どのようにこの問題を解決するには?

実際には、私たちのビジネスの問題点のいくつかとの問題が非常に似ています。一方で我々は、ユーザは、より高速のハードドライブよりも、我々はメモリ内のすべてのデータが(メモリを読み取ることができない一方で、ユーザーエクスペリエンスの前提を確保する上で(このような機器リスト、オーダーリストなど)のデータと書き込み速度を照会することができ、我々はそうしたいですそれはで)なぜハードドライブを説明していません。だから、最終的にこの問題を解決するためにどのように?

それは地域の原則に来るときここではそれが必要です。局所性の原理は、多くの場合、小さな連続した領域に集まる傾向にあるデータへのアクセスを指します。ここでの連続した領域には二つの側面を含みます:

  • Timeディメンション:次の時間短い期間に使用されるデータは、再び使用される傾向にあります。
  • 外形寸法:使用するデータ、その関連データも頻繁に使用されます。

局所性の原理は、メモリ内の問題を解決するために提案されているキャッシュの一部です。

私は共有したときに実際には、多くの場合、分散友人といくつかの考えは、言った:分散システムと内部がスタンドアローンと非常によく似ていますが、多くの概念が連結されています。この点を考え出したとき、二つの違いを考えることが可能です。

実際には、ミドルウェアをキャッシュすることは、地域の原則を使用することであるが、キャッシュは局所性の原則の時間ディメンションを実現するために自分自身をミドルウェア。多くの人々は、キャッシュミドルウェアは二十から八の法則に沿って、ホットデータを格納するために使用されていると言う理由です。しかし、私たちは、地域の一部の原則の適用における空間次元を達成することができます。

キャッシュの場所

五十六年前、誰かが我々はそれを分割することができますどのようにキャッシュ、非永続的なデータとして使用されているキャッシュに関する質問をしました。その可用性を確保する必要があります。その中でもアリ、彼はより多くの永続的なデータ・キャッシュではないと思われるために傾斜していることを彼の本の中で先輩は、キャッシュは、信頼性の高いデータソースとして使用すべきではありません。しかし、先輩は、キャッシュ依存関係重いため、既存のフレームワークは、それらがキャッシュ雪崩を避けるために、ある程度保護されるべきであると述べました。

私の見解では、既存の技術システムでは、キャッシュミドルウェアはもはや単なるキャッシュではない、ということです。一方で我々は、キャッシュ内のセッションやその他の重要なデータを持っており、現在はより適切な対応ストアを(私はそれが新しい一時的な記憶を必要としないと思いますが、必要に応じて、ミドルウェアに従ってので、上のインスタンスをキャッシュすることができていませんコンテンツのグループのライフサイクル、など)。一方、我々は、それが唯一のキャッシュとして使用されているシステムのキャッシュ責任をクリアする必要があり、分散メモリの数。しかし、スタンドアロンとして、すべての内部コールはミドルウェアやRPCメッセージングなどを通じて達成されなければなりません。そして、中央に配置すべきではない、そのようなセッションCookieなど、さまざまな機能のキャッシュをクリア。

キャッシュ分類

キャッシュフレームワークは、実質的に次のカテゴリに、クライアントからのデータソースを終了することができます。

  • ブラウザのキャッシュ
    • クッキー
    • ローカルストレージ
    • sessionStorage
  • CDNキャッシュ
  • 負荷レベルのキャッシュ
    • nginxのキャッシュモジュール
    • イカのキャッシュサーバ
    • Luaの拡張
  • アプリケーション層のキャッシュ
    • たEtag
    • ThreadLocalの
    • グアバ
  • 外部キャッシュ
    • Redisの
  • データベースキャッシュ
    • MySQLのキャッシュ

私は具体的には、百度、ブログのホームページ上の関連するキャッシュ・アーキテクチャについて尋ね半分だけバッファキャッシュアーキテクチャの周りにある精巧なミドルウェア、そして残りは通常、ブラウザのキャッシュなどの大カテゴリ(、データベースキャッシュの省略と考えられています)。もちろん、いくつかのブログは、特定の地域でより詳細に精緻化、または分割レベルはかなり良いですもあります。したがって、このブログは、専用キャッシュ・アーキテクチャの私の理解では、この段階で記述されている(また、いくつかの書籍、コースのキャッシュシステムを借りました)。

ブラウザのキャッシュ

ブラウザのキャッシュは、多くの場合、後端部で忘れられています。それは、バックエンドの作業にも属していないが、それは技術的な建築家や責任の関連業務に属している必要がありますので。もちろん、私は特別なフロントエンドの開発を行っている理由があります。

端的に言えば、それはブラウザ内のデータの一部を保存することです、もちろん、これはフロントエンドの開発が必要です。

ここで直接地図上に、我々はクッキー、のlocalStorage、のsessionStorageを見ることができます。

PS:から写真ネットワーク

優位

フレームの対応最後に、Webクライアントの要求全体に配置ブラウザのキャッシュ、以来、そのトラフィック負荷やストレスプロバイダへの影響はありません。しかし、少しストアは、クライアントのブラウザの計算負荷を占めています。

ご注意ください

  • ストレージ容量のようなクッキーは、ノートの分配に、限定されています。
  • クッキーなどは、そうでない場合は、セキュリティ上のリスクがあるだろう、クリアテキストで保存され、機密データを格納することはできません。
  • 蓄積時間の有効時間に注意が必要なCookieの設定。
  • クッキーとその特定の学習費、及び(例えばクッキードメインの設定の問題、クッキーデータがサブドメインを読み取ることができない親ドメインなど)に関連する機能があります。
  • クッキーおよびその他の事業は、このようなドメイン名として、ここではどのようなデータのフィット明確な必要があります。

実用化

私の以前のプロジェクト責任IOTでは、ページは、大量のデータは、センサーのリストは、ポイントのリストを監視し、そのような端末リストとして、しばしばあります。そして、このような対応アラームがセンサーリストの間でデータのリストを取得する場合は、リストで端末リストを既存の対応のセンサーを取得し、する必要性など、いくつかのデータの関係は、存在します。

ページ切り替えを回避するために、のlocalStorageによって記憶された端末のリスト(リストを要求する端末リストセンサ選択、端末ニーズのリストを取得するために、例えば)複数の要求のリストを得るために必要とされます。

CDNキャッシュ

CDN、コンテンツ配信ネットワーク、すなわち、コンテンツ配信ネットワーク。

  • CDNのコンテンツ配信ネットワークは、ネットワーク上に構築することです
  • CDNは、ネットワークの輻輳を回避するために、最寄りの必要なコンテンツを取得することを可能にユーザアクセス速度を向上させることができます
  • CDNは、サーバーが負荷分散、コンテンツ配信、スケジューリングモジュールを含む、コンテンツの同期サーバーをミラーリングすることによって、国で展開されている依存しています。

優位

  • アクセスのレイテンシを削減します。それが過度の遅延を回避するために、ルートにアクセスするユーザを引き起こし、ユーザが近くの所望のコンテンツを取得することを可能にします。
  • サーバーのストレスを軽減します。CDNサーバ上のコンテンツのすべての後、取得したアプリケーションサーバーを使用しないでください。
  • オペレータ差の解消。すべてのユーザーが品質への同じアクセスを受け取ることができるように、インターネット事業者は、ボトルネックの家族の影響を排除するために
  • アンチクラスタ攻撃。CDNは、効果的にDDOS攻撃が防ぐことができ、広範囲のノード。

短所

  • スローシンクロ。以来、CDNノードの大層状分布であるので、ゆっくりと同期されたデータを配信します。
  • あなたが有料サービスを使用している場合は、特定の支出を必要とします。あなたは自作のCDNている場合は、技術のために支払う必要があります。個人的な勧告、必要に応じて、または直接CDNサービスを使用しては、費用対効果の高い、それを充電します。
  • Webシステム自体は、それに応じて調整する必要があります。そのようなファイルの更新やファイルのアップデート(バージョン番号やその他の手段)やその他の問題として、CDNサーバ。

キーテクノロジー

この部分は、網易クラウド教室を引用しました。

  • キャッシュ
    • プロキシのキャッシュソフトウェア:イカ
    • キャッシュのヒット率の決定アルゴリズム、圧力源サーバ、FTPノードのストレージ容量
  • 配布機能
    • 分布容量は、IDC(インターネットデータ西)能力と戦略的な分布に依存IDC
  • ロードバランシング
    • 負荷分散ソフトウェア:nginxの
    • 最適なルート、応答時間、可用性、サービスの品質を決定するためにバランシング(インテリジェントスケジューリング)をロード
  • ベースのDNS
    • DNSサーバソフトウェア:BIND
    • 最高のサービスノードの裏をかくベースのセカンダリドメイン名を達成するためにバランスをとるCNAME DNSロード
    • キャッシュポイントは、クライアントブラウザのキャッシュ、ローカルDNSサーバのキャッシュを持っています
    • ああ、DNSアドレスのキャッシュを持っているバッファを聞かせて、クライアントがコンテンツのキャッシング、動的コンテンツのキャッシングを要求します
  • サポート契約
    • 静的および動的な加速度(ピクチャー加速度、加速度とHTTPS証明書)
    • ダウンロード加速
    • ストリーミングメディアアクセラレーション
    • エンタープライズアプリケーションの高速化
    • 電話アプリケーションの高速化

それについての知識を展開すると(恥ずかしいです)

実用化

あなたは、フロントエンドのコードを書いた場合は、時々、私たちはjQueryの、などを使用して、CSSやCDNアドレスの他のほとんどの公共の共通JSを知っています。

一部の企業は、上場企業の数は、CDN上のJS、写真、その他の静的なリソース(特に、会社のロゴなど)、となります。ときにWeb開発、対応するCDNアドレスへの直接参照。

負荷レベルのキャッシュ

負荷レベルのキャッシュは、一般的に私はnginxの例を取っ​​たロードバランサキャッシュ、関連付けられています。

キャッシュを達成するために以下の3つの方法によって、Nginxは:

  • 独自のキャッシングモジュール
  • 対応するキャッシュサーバに要求を転送します
  • 外部キャッシュモジュール(例えばRedisの等)から直接LUAキャッシュデータにより取得することができます

その後の精緻化

nginxのキャッシュモジュール

nginxののHTTP_PROXYモジュールは、同様のイカキャッシュ機能を実現することができます。

nginxのクライアントを使用すると、一定の期間内に再度アクセスしたとき、あなたはアプリケーション・サーバーのバックアップを要求する必要はありません、ローカルにキャッシュされたコピーを作成し、nginxのサーバーのコンテンツへのアクセスを持っています。

同時に、アプリケーションサーバの背面にはサービスを(たとえば、ダウンタイムなど)を提供することができないとき、nginxのサーバー上のキャッシュリソースは、アプリケーション・サーバ(堅牢性)の背中の堅牢性を向上させるために関連するユーザーの要求に応えることができます。

優位

  • いいえ事業は、費用はかかりません。nginxのは、ビジネスを支払うことなく、オープンソースです。
  • 低コスト技術の繰り返し。nginxの中の技術の反復は、唯一の新しいモジュールを追加する必要があるとき、彼らは、nginxのを使用する既存のWebシステム。
  • カスタマイズ可能。パスを指定するには、必要に応じて、戦略をキャッシュカスタマイズするリソースを指定します。

短所

  • ある程度の知識と学習nginxのキャッシュモジュールが必要です。結局、多くの人はただの設定でnginxのCVを使用しています。
  • キャッシュ戦略を調整するビジネスニーズと技術的な特性に基づいて必要があります。あなたは十分な知識と経験が不足している場合、(データはnginxのキャッシュモジュールなどを行くべきかなどの)キャッシュ技術仕様を指定することは不適切かもしれません。

基本的な理解

キャッシュファイルの場所の設定

Proxy_cache_pathは、パラメータで指定されました。proxy_cache_path 2つの必須パラメータがあります。

  • キャッシュディレクトリの最初のパラメーター。
  • 二keys_zoneパラメータはスペースのためのキャッシュメモリの名前とサイズを指定します。
指定特定の要求がキャッシュされています
  • nginxのデフォルトのキャッシュすべてのヘッドと、デフォルトのキャッシュをリクエストメソッドの結果を取得し、キー要求文字列
  • カスタムキー。proxy_cache_keyとして "$ホスト$ REQUEST_URI $ cookie_user"。
  • 唯一のキャッシュされている低周波リクエストを防ぐために、キャッシュされた回数を指定要求は、少なくとも介して送信されます。proxy_cache_min_uses 5;
  • キャッシュされているメソッド指定された要求。proxy_cache_methodsとしてHEAD POSTをGET。
キャッシュの有効期限

デフォルトでは、キャッシュの内容はを知っている人を超えたキャッシュ容量の制限がない限り、長期保存されています。また、設定が有効である時間をカスタマイズすることができます。以下のような:

  • 応答ステータスコードは200302であり、有効期限が10分:proxy_cache_valid 302 10メートル200。
  • 任意のステータスコード、有効期限5分:任意の5メートルをproxy_cache_valid。
部分的にキャッシュ要求バイパス

対応する生データではなく、キャッシュからの明示的な要求に応じてproxy_cache_bypass命令によって。

例えば(YORK雲のクラスからこの例)proxy_cache_bypass $ cookie_nocache $ arg_nocache $ arg_comment。

彼は言った:任意の1つのパラメータが空ではない、そうでないか0に等しい場合は、nginxのは、キャッシュ、直接転送エージェントを見つけることができません。

スプレッド

キャッシュされたページは、プライベート、キャッシュなし、最大エージングを持っているデフォルトがプライベートである、のような、必見再検証共通の値を制御するHTTPメッセージヘッダの「キャッシュ・コントロール」です。以下の表:

ここに画像を挿入説明

イカのキャッシュサーバ

実際には、イカのキャッシュサーバnginxのキャッシュは、中・深いたしませんので、ここでは、そのような選択肢があるだけで、(すべての後に、イカのnginxのキャッシュをモデルにしている)非常によく似ています。

Luaの拡張

nginxのである(これは、高性能のnginxの根本的な原因の一つである)、C言語の開発、nginxのモジュールはC開発を使用する必要があり、ルールの複雑なセットに準拠する必要もnginxの源に精通している必要があります。

ngx_luaモジュール

LUA nginxので通訳に統合され、nginxのモジュールようngx_luaを提供します。Ngx_luaモジュールは、次の機能があります。

  • 高い同時、様々な要求に契約を非ブロック。
  • したがってフォーム配列として構築されたLuaのコルーチン(同等golang)は、非同期コールバック呼び出しに変換されます。
  • それぞれがグローバルに共有、読み取り専用「commanデータ」から継承した別のコルーチン地球環境(変数空間)を、持っています。

これらは、関連する情報を問い合わせることができます興味だけで簡単に言及Luaの拡張子、です。

ここでは、Luaがキャッシュ機能を実現するために、拡張記述することになります。

実用化

助けるために、あなたは実用的なアプリケーションについて話をし、理解しています。

、11のステージを処理するためのnginxのHTTPリクエスト。対照的に、命令実行モジュールngx_luaは、上記11段階に含まれています。のみnginxのステージのコンテンツのcontent_by_lua命令についてここで、前記要求処理及び出力の受信に応答して、メインプロセッサのコンテンツとして、範囲場合場所、場所で使用することができます。

次のように具体的な構成は次のとおりです。

ここに画像を挿入説明

この設定の後、ローカルIPへの直接ブラウザアクセス(またはカールコマンドを使用して)、あなたは「こんにちは、世界」を見ることができます。

もちろん、比較的ジュニアのこの使用。OpenRestyいくつかのコンポーネント、モジュールはngx_lua Redisの直接アクセスなどのデータソースを助けることができます。これは、圧力アプリケーションサーバを削減する、いくつかの簡単なデータがこの方法でアクセスすることができます。

優位

  • 圧力アプリケーションサーバを削減
  • しきい値を下げてください。いくつかの設定テンプレートによると、それを直接使用することができます
  • スケーラビリティ強いです。上限ngx_luaアプリケーションモジュールは、比較的高いままであります
  • 強力な柔軟性。柔軟性ngx_luaモジュール、キャッシュの面で高い柔軟性を示します

短所

  • 困難なマスターに。例この部分のマスターになりたい、私たちは、Luaのスクリプトを知っておく必要があり、nginxのHTTPリクエストの舞台のように。
  • 追加の開発タスク。アプリケーション開発に加えて、だけでなく、専門的なLuaの開発が必要。
  • 高をカップリング。ページには、この関数は、多くの場合、nginxのとバックエンドの共同開発が必要です。
  • タスクを定義するのは困難です。事業開発機能の一部が属するモジュール(nginxの、バックエンド)のかを定義することは困難です。

概要

ブラウザのキャッシュ、CDNキャッシュ、負荷層キャッシュ:これまでのところ、我々はキャッシュユーザーの3層アーキテクチャに最も近い、キャッシュについて学んできました。

質問や疑問が存​​在する場合は、民間の手紙や私@することができます。

おすすめ

転載: www.cnblogs.com/Tiancheng-Duan/p/12154529.html