高速Webアプリケヌション-Web Trepanation

心理孊は興味深く、時には圹に立぀科孊です。 倚数の調査によるず、300ミリ秒以䞊にわたっおWebペヌゞの衚瀺が遅れるず、ナヌザヌはWebリ゜ヌスから泚意をそらし、「䞀䜓どうしたの」ず考えるようになりたす。 したがっお、Webプロゞェクトを心理的に知芚できない倀に加速するこずにより、ナヌザヌをより長く保぀こずができたす。 そしお、それがビゞネスが速床にお金を費やす準備ができおいる理由です$ 80M-わずか1 msだけレむテンシヌを削枛したす







ただし、最新のWebプロゞェクトを高速化するためには、kroushkaにこのトピックを培底的に掘り䞋げる必芁がありたす。したがっお、ネットワヌクプロトコルの基本的な知識は倧歓迎です。 原則を知っおいれば、わずかなアプロヌチでWebシステムを数癟ミリ秒で簡単に高速化できたす。 さお、数億を節玄する準備はできおいたすか コヌヒヌを泚ぐ。



埌味



これは非垞にホットなトピックです-サむトのナヌザヌを満足させる方法-そしお、ナヌザビリティ䞻矩者はおそらく私にモロトフカクテルを飲たせ、小切手なしで手ade匟を噛たせ、爆発の前に叫ぶ時間を䞎えたす「私は異端を運んでいたす。」 したがっお、私は反察偎から行きたいです。 ペヌゞの衚瀺の遅延は0.3秒以䞊であるこずが広く知られおいたす。これにより、ナヌザヌはこれに気づき、サむトずの通信プロセスから「目芚め」たす。 そしお、衚瀺の遅延は1秒以䞊です。トピックに぀いお考えるず、「ここで䜕をしおいるのですか なぜ圌らは私を拷問し、私を埅たせおいるのですか」



したがっお、私たちは圌らの「䜿いやすさ」に䜿いやすさを䞎え、実甚的な問題に察凊したす-クラむアントの「倢」を劚げず、「ブレヌキ」に気を散らすこずなく、できるだけ長くサむトで圌の仕事を促進しないか。



スピヌドの責任者



たあ、もちろんあなたは誰ですか。 そうでなければ、あなたはほずんど蚘事を読み始めたせんでした。 真剣に、問題がありたす-速床の問題は、技術的および瀟䌚的に緩やかに接続された2぀のフロント゚ンドずバック゚ンドに分かれおいたす。 そしお、圌らはしばしば3番目の重芁なコンポヌネントであるネットワヌクを忘れたす。



HTMLだけ



たず、90幎代前半の最初のサむトは静的なペヌゞのセットだったこずを思い出しおください。 たた、HTMLはシンプルでわかりやすく簡朔でした。最初のテキスト、次にテキストずリ゜ヌスです。 Bacchanaliaは、Webペヌゞの動的な生成ずjava、perlの普及から始たりたしたが、今日では、すでにPHPを含む技術の銀河です。

この競争がネットワヌクの実行可胜性に䞎える圱響を軜枛するために、1996幎にHTTP / 1.0に埓い、3幎埌-1999幎にHTTP / 1.1になりたした。埌者では、TCPハンドシェむクを光の速床の玄2/3で駆動する必芁がないこずに最終的に同意したした光ファむバヌ各芁求に察応し、新しい接続を確立するか、TCP接続を䞀床開いお凊理したす。



バック゚ンド



アプリ


ここ40幎間でここでほずんど倉化はありたせん。 おそらく、 NoSQLずいう名前でリレヌショナル理論の「パロディ」が远加されたした。これは長所ず短所の䞡方をもたらしたす。 しかし、実践が瀺すように、それはビゞネスからより有益であるず思われたすただし、「敎合性デヌタを誰がどのような口実で奪ったか」ずいう質問ぞの回答を含む眠れぬ倜は、より可胜性が高くなりたした。

  1. アプリケヌションおよび/たたはWebサヌバヌphp、java、perl、python、rubyなど-クラむアント芁求を受け入れたす
  2. アプリケヌションはデヌタベヌスにアクセスし、デヌタを受信したす
  3. アプリケヌションはhtmlを生成したす
  4. アプリケヌションおよび/たたはWebサヌバヌ-クラむアントにデヌタを送信したす


ここでは速床の点ですべおが明確です。





「アプリケヌション」のオヌバヌクロックに぀いおはもう説明したせん。倚くの本や蚘事が曞かれおおり、すべおが非垞に盎線的でシンプルです。

䞻なこずは、アプリケヌションが透過的であり、アプリケヌションのさたざたなコンポヌネントを介しおリク゚ストの速床を枬定できるこずです。 そうでない堎合は、さらに読むこずはできたせん、それは助けにはなりたせん。

これを達成する方法は パスは既知です



倧量のログがあり、それらで混乱しおいる堎合-集蚈デヌタ、パヌセンタむルず分垃を参照しおください。 シンプルでわかりやすい。 0.3秒以䞊のリク゚ストが芋぀かりたした-最埌たでデブリヌフィングを開始したす。



Webサヌバヌ


匕っ越したす。 Webサヌバヌ。 ここでは、ほずんど倉曎はありたせんが、Webサヌバヌfascgiサヌバヌの前にリバヌスプロキシWebサヌバヌをむンストヌルするこずで、束葉杖が発生する可胜性がありたす。 はい、確かに圹立ちたす

  1. クラむアントずのより倚くのオヌプンな接続を維持するために犠牲になりたすか..はい、キャッシングプロキシの別のアヌキテクチャ-nginxの堎合、これは1぀の接続に少数のプロセスず䜎メモリによる゜ケット倚重化を䜿甚したす
  2. アプリケヌションコヌドをフィルタリングせずに、ディスクから静的リ゜ヌスを盎接効率的に提䟛したす。


しかし、疑問は残っおいたした。なぜ圌らはすぐに「正しく」 Apacheを始めなかったのですか。時にはWebサヌバヌを電車に乗せる必芁がありたす。



氞続的な接続


TCP接続の確立には1 RTTかかりたす。 チャヌトを印刷しお、あなたの前でハングアップしたす。 ブレヌキの倖芳を理解する鍵はここにありたす。



この倀は、Webサヌバヌに察するナヌザヌの䜍眮ず非垞に密接に盞関しおいたすはい、光の速床があり、マテリアルに光の䌝搬速床があり、ルヌティングがありたす、数十たたは数癟ミリ秒かかるこずがありたすもちろん、非垞に倚いです 。 そしお、問題は、この接続がリク゚ストごずに確立される堎合です。これはHTTP / 1.0で䞀般的でした。







このため、HTTP 1.1は抂しお開始され、 HTTP 2.0  spdyで衚されるもこの方向で開発されおいたす。 GoogleずのIETFは珟圚、珟圚のネットワヌクアヌキテクチャを最倧限に掻甚するために、それを砎壊するこずなく最善を尜くしおいたす。 そしお、これを行うこずができたす...たあ、はい、TCP接続を可胜な限り効率的に䜿甚し、 倚重化 、パケット損倱からの回埩などを通じお垯域幅を可胜な限り密に䜿甚したす







したがっお、Webサヌバヌおよびアプリケヌションでの氞続的な接続の䜿甚を必ず確認しおください。



TLS


もずもずSSLずしおNetscape Communicationsの腞で始たったTLSがなければ、珟代の䞖界にはどこにもありたせん。 そしお、圌らは蚀うが、このプロトコルの最埌の 「穎」は締め切りよりもはるかに早く倚くの灰色に倉わりたした-実際には代替手段はありたせん。

しかし、䜕らかの理由で誰もがTLSが「埌味」を悪化させるこずを芚えおいるわけではありたせん-TCPを介した1 RTT接続に加えお1-2 RTTを远加したす。 nginxでは、デフォルトのTLSセッションキャッシュはデフォルトでオフになっおいたす-これにより、䜙分なRTTが远加されたす。







したがっお、TLSセッションが必ずキャッシュされるこずを確認しおください。そのため、別の1 RTTを保存したす残念ながら、セキュリティ料金ずしお1぀のRTTが残りたす。



おそらくバック゚ンドに぀いおです。 さらに難しくなりたすが、より面癜くなりたす。



ネットワヌク。 距離ずネットワヌク垯域幅



倚くの堎合、50Mbit / s、100Mbit / s、4Gでさらに倚くの音が聞こえたす...しかし、兞型的なWebアプリケヌションでは、垯域幅はそれほど重芁ではないファむルがダりンロヌドされない限りこずはランタンシヌよりもはるかに重芁であるずいう理解はほずんどありたせんに。 倚くの小さなリク゚ストが異なる接続で行われ、TCPりィンドりにスむングする時間がありたせん。

そしおもちろん、クラむアントがWebサヌバヌから遠ざかるほど長くなりたす。 しかし、そうでなければ䞍可胜たたは困難であるこずが起こりたす。 それが圌らが思い぀いた理由です

  1. CDN
  2. 動的プロキシCDNたたはその逆。 たずえば、nginxがリヌゞョンにむンストヌルされるず、Webサヌバヌぞの氞続的な接続が開かれ、sslが終了したす。 分かりたすか ぀たり、クラむアントずWebプロキシ間の接続が数回加速されハンドシェむクが開始されたす、加熱されたTCP接続が䜿甚されたす。


他にできるこず... TCPの初期茻茳りィンドりを増やしたす-はい、これはしばしば助けになりたす。 Webペヌゞは、確認なしで1セットのパッケヌゞで提䟛されたす。 詊しおみおください。







ブラりザヌデバッガヌをオンにしお、Webペヌゞの読み蟌み時間を確認し、埅機時間ずその削枛方法を怜蚎したす。



スルヌプット


TCP接続りィンドりは最初にオヌバヌクロックする必芁があるこずに泚意しおください。 Webペヌゞが1秒未満でロヌドされる堎合、りィンドりを拡倧する時間がありたせん。 䞖界の平均ネットワヌク垯域幅は3メガビット/秒よりわずかに高いです。 結論-確立された1぀の接続を通じお可胜な限り送信し、「りォヌムアップ」したす。







単䞀のTCP接続内でのHTTPリ゜ヌスの倚重化は、ここで確かに圹立ちたす。芁求ず応答の䞡方で混合されたいく぀かのリ゜ヌスを転送したす。 そしお、この技術でさえ暙準に含たれおいたしたが、過小評䟡されおいたため、うたくいきたせんでした クロムでは、ごく最近になっお削陀されたした。 したがっお、ここでは、ただspdyを詊す、HTTP 2.0を埅぀、たたはパむプラむンを䜿甚できたす。ただし、ブラりザからではなく、アプリケヌションから盎接実行できたす。







ドメむンシャヌディング


しかし、非垞に人気のあるドメむンシャヌディングテクニックに぀いおはどうでしょうか。ブラりザ/アプリケヌションがドメむンごずに6以䞊の接続の制限を克服し、架空のドメむンぞの別の6以䞊の接続を開くずきimg1.mysite.ru、img2.mysite.ru ... ここが楜しいのは HTTP / 1.1の芳点から-これはあなたを加速する可胜性が高く、HTTP / 2.0の芳点から-これはアンチパタヌンです TCP接続でHTTPトラフィックを倚重化するず、スルヌプットが向䞊したす。

したがっお、今のずころ-ドメむンをシャッフルし、HTTP / 2.0がこれを行わなくなるのを埅っおいたす。 もちろん、Webアプリケヌション専甚に枬定し、十分な情報に基づいお遞択するこずをお勧めしたす。



フロント゚ンド



Webペヌゞのレンダリング速床、画像ずJavaScriptのサむズ、リ゜ヌスのロヌド順序などのよく知られたものに぀いお -曞くのは面癜くない。 テヌマはbeatられ殺されたす。 䞀蚀で蚀えば䞍正確-Webブラりザヌの偎でリ゜ヌスをキャッシュしたすが、...頭で。 10MBのjsファむルをキャッシュし、各Webペヌゞのブラりザ内で解析したす-それが䜕をもたらすかを理解しおいたす。 ブラりザデバッガをオンにし、コヌヒヌを泚いで、䞀日の終わりたでに-傟向は明らかです。 蚈画の抂芁を説明し、実行したす。 シンプルで透明。

はるかに鋭い萜ずし穎は、比范的新しく急成長しおいるWebブラりゞング機胜の背埌に朜む可胜性がありたす。 それらに぀いおお話ししたす。

  1. XMLHttpRequest
  2. 長いポヌリング
  3. サヌバヌ送信むベント
  4. Web゜ケット




ブラりザ-オペレヌティングシステムのような


圓初、ブラりザはHTMLマヌクアップを衚瀺するためのクラむアントアプリケヌションずしお認識されおいたした。 しかし、毎幎それは銀河系技術のコントロヌルセンタヌになりたした。その結果、HTTPサヌバヌずその背埌のWebアプリケヌションは、ブラりザヌ内の補助コンポヌネントずしおのみ認識されるようになりたした。 興味深い技術的倉化が匷調されおいたす。

さらに、ブラりザに組み蟌たれたWebRTC 「テレビスタゞオ」の出珟ず、ブラりザのネットワヌクず倖界ずのやり取りの手段により、パフォヌマンスの問題はサヌバヌむンフラストラクチャからブラりザにスムヌズに移行したした。 この内郚キッチンがクラむアントで遅くなる堎合-Webサヌバヌ䞊のphpを芚えたり、デヌタベヌスに参加したりする人はいたせん。



この䞍透明なモノリスを郚品に぀いお分析したす。



XMLHttpRequest


これはよく知られおいるAJAX-ブラりザがHTTP経由で倖郚リ゜ヌスにアクセスする機胜です。 CORSの出珟により、完党な「カオス」が始たりたした。 ここで、ブレヌキの原因を特定するには、すべおのリ゜ヌスを登り、どこでもログを調べる必芁がありたす。

真剣に、この技術は間違いなくブラりザヌの機胜を爆砎し、動的に情報をレンダリングするための匷力なプラットフォヌムに倉えたした。 それに぀いお曞くこずには意味がありたせん、トピックは倚くの人に知られおいたす。 ただし、制限に぀いお説明したす。

  1. 繰り返したすが、耇数の「チャネル」の倚重化の欠劂により、TCP接続垯域幅の䜿甚が非効率的か぀䞍完党になりたす。
  2. ストリヌミングの適切なサポヌトがありたせん接続を開いおハングしたす、お埅ちください、぀たり サヌバヌを匕っ匵り、圌が答えたものを芋るこずが残っおいたす








ただし、この技術は非垞に人気があり、速床監芖の芳点から透過的にするこずは難しくありたせん。



長いポヌリング


りェブチャットの䜜り方は はい、どういうわけか倉曎に関する情報をサヌバヌからブラりザヌに送信する必芁がありたす。 HTTP経由で盎接-できたせん、できたせん。 のみ芁求ず応答。 人々が決定したのは額でしたリク゚ストをしお、答えを埅っおください、秒、30秒、分。 䜕かが来たら、返しお切断しおください。



はい、倚くのアンチパタヌン、束葉杖-しかし、この技術は非垞に広く普及しおおり、垞に機胜しおいたす。 しかし、なぜなら あなたは速床に責任がありたす-このアプロヌチでのサヌバヌの負荷は非垞に高く、Webプロゞェクトのメむントラフィックからの負荷ず比范できたす。 たた、サヌバヌからブラりザぞの曎新が頻繁に配信される堎合、䞻な負荷は䜕床も超える可胜性がありたす

どうする



サヌバヌ送信むベント


これにより、WebサヌバヌぞのTCP接続が開かれ、閉じられず、サヌバヌは異なる情報をUTF-8に曞き蟌みたす。 確かに、予備のBase64なしではバむナリデヌタを最適に送信するこずはできたせんサむズが33増加したすが、䞀方向の制埡チャネルずしおは優れた゜リュヌションです。 IEで真-サポヌトされおいたせんどこでも機胜する䞊蚘の段萜を参照。









テクノロゞヌの利点は次のずおりです。

  1. ずおもシンプル
  2. メッセヌゞを受信した埌、サヌバヌぞの接続を再床開く必芁はありたせん




Web゜ケット


システム管理者にずっお、これは獣ではなく、倜の死䜓です。 HTTP 1.1アップグレヌドを通じお「巧劙な」方法で、ブラりザはHTTP接続の「タむプ」を倉曎し、開いたたたにしたす。









次に、OBEの接続を介しお、メッセヌゞフレヌムにフレヌム化されたデヌタの転送を開始できたす。 メッセヌゞには情報が含たれるだけでなく、次のものを含む制埡メッセヌゞも含たれたす。 「PING」、「PONG」ず入力したす。 第䞀印象-自転車が再び発明され、再びTCPに基づいたTCPが発明されたした。

開発者の芳点から-もちろんこれは䟿利ですが、ブラりザずサヌバヌ䞊のWebアプリケヌションの間に二重チャネルが衚瀺されたす。 ストリヌミングが必芁ですか、メッセヌゞが必芁ですか。 しかし

  1. HTMLキャッシュはサポヌトされおいないため バむナリフレヌミングプロトコルを䜿甚する
  2. 圧瞮はサポヌトされおいたせん。自分で実装する必芁がありたす
  3. TLSなしで䜜業する堎合のひどいグリッチず遅延-叀いプロキシサヌバヌが原因
  4. 倚重化なし。その結果、各接続の各垯域幅が非効率的に䜿甚されたす。
  5. サヌバヌには、ブラりザからの盎接のTCP接続が倚数あり、「デヌタベヌスにずっお厄介な」こずをしおいたす








Web゜ケットのパフォヌマンスを远跡する方法は 非垞に良い質問です。特におや぀に残したした。 クラむアント偎WireSharkパケットスニッファヌ、サヌバヌ偎、TLSを有効化では、nginxのモゞュヌルにパッチを圓おるこずで問題を解決したすが、より簡単な解決策があるようです。



䞻なこずは、Web゜ケットが内郚からどのように配眮されおいるかを理解するこずです。これは既にわかっおおり、速床制埡が提䟛されたす。

XMLHttpRequest、Long Polling、Server-Sent Events、たたはWeb Socketsのどれが良いでしょうか 成功は、これらの技術の適切な組み合わせにありたす。 たずえば、WebSocketsを介しおアプリケヌションを管理し、AJAXを介した組み蟌みキャッシュを䜿甚しおリ゜ヌスをロヌドできたす。



今䜕をしたすか



蚭定ポむントを枬定しお察応する方法を孊びたす。 Webアプリケヌションのログを凊理し、それらの遅いク゚リを凊理したす。 ナビゲヌションタむミングAPIのおかげで、クラむアント偎の速床も枬定できるようになりたした。ブラりザでパフォヌマンスデヌタを収集し、JavaScript経由でクラりドに送信し、ピンバで集蚈し、逞脱に察応したす。 非垞に䟿利なAPIです。必ず䜿甚しおください。







その結果、 nagiosなどの監芖システムに囲たれた状態になり、Webシステムの速床ですべおが正垞であるこずを瀺す12個たたは2個の自動テストが行​​われたす。 そしお、肯定的な堎合-チヌムが組み立おられ、決定が䞋されたす。 ケヌスは、たずえば次のようなものです。



など



たずめ



最新のWebアプリケヌションの䞻芁コンポヌネントを調べたした。 HTTP 2.0の傟向に぀いお理解し、Webアプリケヌションの応答速床を可胜な限り0.3秒に抑えるために理解しお枬定するこずが重芁なコントロヌルポむントを孊びたした。 圌らは、ブラりザで䜿甚されおいる最新のネットワヌク技術の本質を芋お、その利点ずボトルネックを特定したした。



ネットワヌクの動䜜、速床、遅延、垯域幅を理解するこずが重芁であるこずを理解したした。 そしお、その垯域幅は垞に重芁ずいうわけではありたせん。



Webサヌバヌずデヌタベヌスを「拡匵」するだけでは䞍十分であるこずが明らかになりたした。 ブラりザヌで䜿甚されるネットワヌクテクノロゞヌの抂芁を理解し、内郚から把握しお効果的に枬定する必芁がありたす。したがっお、TCPトラフィックスニファヌが右手になり、サヌバヌログの䞻芁なパフォヌマンスむンゞケヌタヌの監芖が巊足になりたす。



さたざたな方法で「0.3秒」でクラむアント芁求を凊理する問題を解決するこずができたす。 䞻なこずは、メトリックを決定し、自動的にそれらを収集し、それらを超えた堎合に行動するこずです-各特定のケヌスのルヌトを掘りたす。 圓瀟の補品では、静的および動的サむトテクノロゞヌを組み合わせた包括的なキャッシングテクノロゞヌのおかげで、可胜な限り䜎いレむテンシを確保するずいう問題を解決したした。



最埌に、5月23日に間もなく開催される技術䌚議にご招埅したす。 Webプロゞェクトの生産性を確保するずいう困難なタスクでの幞運ず成功



All Articles