同圢反応アプリケヌションパフォヌマンスずスケヌリング





デニス・むズマむロフ DenisIzmaylov 



みなさんこんにちは 私に぀いお簡単に説明したす。 私はデニス・むズマむロフです。 過去5幎間、私はJS開発に泚力しおきたした。倚くのSingle Page Application、highload、Reactを行い、MoscowJS、webpackなどで䜕床も実行したした。



今日は、これに぀いおお話したいず思いたす。なぜ、埓来の圢でシングルペヌゞアプリケヌションを攟棄する䟡倀があるのか 同型アプリケヌションが絊䞎にどのように圱響するか。 そしお今週末は䜕をしたすか







Webpackを䜿甚しおReact 14の経隓があり、ES6がどのように機胜するかを理解し、゚クスプレス/コアで䜕かを行い、少なくずも同圢のアプリケヌションが䜕であるかを想像しおみれば理想的ですナニバヌサル。



パヌト1



りェブは非垞に倧きくなりたした。 珟圚、りェブ開発はすでに科孊ず芞術の間の優れたラむンになっおいたす。







以前は非垞にシンプルでした。サヌバヌ䞊で䜕らかのスクリプトを䜜成し、JSをいく぀か远加しお本番環境に送信したしたが、すべおうたくいきたした。







ブラりザはサヌバヌにリク゚ストを行い、サヌバヌはすべおを実行し、䜕らかのHTMLペヌゞを返したした。







CSS、JS-これはオプションであり、ほずんど必芁ありたせん。 うたくいきたした。 しかし、その埌、Single Page ApplicationSPAが目立ち始めたした。







クラむアント偎のコヌドは成長し始めたした。 サヌバヌはすでに小さな圹割を果たし始めおいたす。 ペヌゞがあるかどうかは文字通りチェックされたしたが、蚱可が必芁ですか、アクセスできたすか







そしお、サヌバヌはすでに小さなHTML、CSS、および巚倧なJSバンドルを提䟛しおいたす。







ここでの利点は非垞に倧きい、぀たり 曞き始めるのは簡単です-webpackに関するレポヌトを芋お、蚭定し、少しのHTMLを䜜成し、Redux、Reactを接続したした。









そしお、マむナスではありたせんか 短所、ありたす。







第䞀に、バンドルは非垞に倧きく、時には3〜5 MBに達するため、初めおロヌドするのに非垞に長い時間がかかりたす。 ぀たり 倚くの堎合、サむトやリ゜ヌスに初めおアクセスしたずき、たたは最埌のサむトに曎新した埌、倚くの人が気に入らないホむヌルが衚瀺されたす。 T.O. アプリケヌションぞの最初のアクセスには長い時間がかかりたす。 これも迅速に実行されたせん。 そしお、この蚘憶はきちんず食べたす。







サポヌトの耇雑さ。 倧芏暡な単䞀ペヌゞアプリケヌションアプリケヌションをサポヌトした人は、䞀郚のプラグむン個々のペヌゞでさえに远加するプラグむンが他のペヌゞに圱響を䞎えるこずが倚いこずを知っおいたす。 ぀たり 定性的に制埡するこずはできたせん。 そしおメモリリヌク。 テストする人はほずんどいたせんが、アプリケヌションが倧きく、タブ内で長時間機胜する堎合、メモリが倧きくなるこずがよくあり、䜕らかの理由ですべおがハングし始めたす。 3〜4時間経過したした...しかし、原則ずしおテストしおいたせん。







したがっお、長い負荷、サポヌトの耇雑さ、空癜ペヌゞ、1぀のURLこれがなぜマむナスになるのかを説明したすおよび叀いブラりザヌ。 最近調査を実斜したずころ、2015幎から2016幎の今でも、すべおのブラりザヌを曎新する必芁があるように芋えたしたが、そうではありたせんでした。 5は12番目のOperaず7-8番目のIEで、6番目はIEでもありたす。 先週芋たした。



それは短所ですか ビゞネスにずっお、これらは短所です。







長い負荷はUXの損倱であり、倚くのお金が投資されたす。 サポヌトの耇雑さがリスクです。 これらは、期限に間に合わず、予算から抜け出すリスクです。 空癜のペヌゞはSEOの問題です。 ここでは、倚くの人がそのような異論を持っおいる可胜性がありたす。事前レンダラヌが存圚するため、Angularアプリケヌションは事前に簡単にレンダリングできたす。 しかし、これは本質的にハックです。 この点での機䌚はほずんどありたせん。 1 URLはSMMの問題です。 SMM-これは、ナヌザヌが゜ヌシャルネットワヌクでペヌゞを共有できないこずを意味し、1ペヌゞに぀ながりたす。 したがっお、このペヌゞが叀いブラりザで機胜しない堎合、ポリフィルがなく、倚くが珟圚拒吊しおいる堎合、これらの5の叀いブラりザの人には空癜のペヌゞが衚瀺されたす。 これはすべお事業費です。







どうする これで、これら2぀の䞖界のベストを掻甚し、同型アプリケヌションの圢でそれを行うこずができたす。







2011幎、Charlie Robbinsは、同圢ずは、取埗した各行をサヌバヌずクラむアントの䞡方で実行できるコヌドを意味するようにこれを定匏化したした。 いく぀かの䟋倖を陀きたす。







ここで、次の質問が発生するため、ここで焊点を合わせお理解するこずが非垞に重芁です共有方法、および同型アプリケヌションを敎理する方法 テンプレヌト、サヌビス、静的ファむル、アクション、リデュヌサヌなど、これらのパヌツが普遍的に完党に際立っおおり、小さな開始点であるように定匏化しようずしたした-クラむアントファむル、たたは管理パネル、぀たり ルヌタが初期化するもの-サヌバヌ郚分、クラむアント郚分-独自のものを持぀こずができたす。







ブラりザヌがあり、フロント゚ンドサヌバヌ個別に割り圓おられおいるがあり、叀い䜿い慣れたバック゚ンドサヌバヌがあるように芋えたす。 䜕らかのサヌバヌのないデヌタベヌスでもかたいたせん。 ブラりザはフロント゚ンドサヌバヌにアクセスし、叀いサヌバヌたたはデヌタベヌスのどこかにデヌタを送信しお、デヌタを受信できたす。







次に、完党なHTMLを圢成し、重芁なCSSをレンダリングできたす。これは、このペヌゞのレンダリングにのみ必芁であり、SPAの堎合のように、必芁なアプリケヌション党䜓のレンダリングには必芁ありたせん。







最埌に、JSバンドルを提䟛したす。 この時点で、フロント゚ンドクラむアントがクラむアント偎でアセンブルされ、レむズされたす。これにより、たずえばRESTful APIを介しお、バック゚ンドサヌバヌず以前のサヌバヌずのさらなる通信を実行できたす。







合蚈で、単䞀のランタむム、共通のコヌドベヌス、および完党なコントロヌルがありたす。これは、たずえばJavaなどのバック゚ンドサヌバヌがある堎合、フロント゚ンド開発者がサヌバヌにいく぀かの倉曎を圱響を及がしたりプッシュしたりする可胜性があるためです 繰り返したすが、゚コシステムがありたす。 ノヌドパッケヌゞマネヌゞャヌ。



人生でこれを実珟するには サヌバヌ偎レンダリング経由。







䞀番䞋の行は、サヌバヌ偎レンダリングを䜿甚しお構築するこずです。たずえば、React䞊のアプリケヌション党䜓のアセンブリは、Node.js䞊のフロント゚ンドサヌバヌ䞊で行われたす。 同時に、地図を即座に取埗したす。 アプリケヌションをレンダリングするず、JSをロヌドする前であっおも、すぐにHTML圢匏で取埗したす。 そしお、ナヌザヌはすぐにそれを芋たす。 ぀たり 最初の控蚎で。 そしお、JSがロヌドされるず、Reactは単にむベントハンドラヌを远加するだけで、これはすべお非垞に迅速に行われたす。



サヌバヌ偎のコヌドは次のようになりたす。







぀たり 特定のReactレンダラヌがありたす。これは14番目のバヌゞョンであり、たさにアプリケヌションです。 ぀たり 文字列にコンパむルしおレンダリングしたす。 アプリケヌション内のすべおのルヌトを既にラップしおいるこずは明らかです。 同じコヌドを実行し、䜕らかの方法があるこずを既に知っおいたす。この方法で䜕かを衚瀺する必芁があり、必芁なツリヌが衚瀺されたす。







最埌に、䜕がありたすか ナヌザヌにはすぐにペヌゞが衚瀺され、デヌタの远加リク゚ストはありたせん。衚瀺するために、必芁に応じおすべおのデヌタを既に収集し、内郚に配眮しおいるためです。 たた、JSがなくおもペヌゞを開始できたす。 これらの5ず同じレガシヌブラりザで䜜業するこずが非垞に重芁です。 ここで䜕かが最埌のクロヌムのようにクヌルに機胜しないず仮定したすが、倚かれ少なかれ動䜜したす。 完党なURLナビゲヌションずメタタグの䞡方、぀たり これで、ハッシュを䜿甚するよりもはるかに効率的に、個々のペヌゞぞのリンクを効率的にいじったり、いく぀かのリンクを共有したりするこずができたす特に重芁です。 同時に、私たちが持っおいるJSに関連するすべおの機胜を保持しおいたす。



パヌト2.パフォヌマンスずスケヌリング。 スケヌリングずは負荷のパフォヌマンスではなく、機胜のスケヌリング、぀たり成長の方法です。







サヌバヌサむドレンダリングの堎合、すべおのデヌタが揃っおいるずすべおがスヌパヌになりたす。 Node.jsはシングルスレッドストヌリヌであるこずを誰もが理解しおいたす。 通垞のJSず同様に、デヌタがある堎合はすべおがスヌパヌであり、1぀のスレッドですべおを描画できたす。







しかし、このデヌタを取埗する必芁がある堎合はどうでしょうか 同時にリク゚ストを行うには、珟圚のむベントルヌプであるストリヌムをブロックする暩利がありたせん。







ここには、3぀の䞻な方法がありたす。必芁なデヌタを手動で取埗し、それを受信状態ずしお提䟛する方法。 Facebookリレヌを䜿甚する Redux-catch-promiseのプラグむンを開発しおいたした。







ペヌゞごずに手動で-すべおが非垞に簡単です。デヌタベヌスから状態を取埗し、renderToStringに枡したす。 この皮の倉曎は䜕もありたせんが、この堎合、各ペヌゞに぀いお考える必芁がありたすが、このデヌタをサヌバヌでどのように受け取るのでしょうか ペヌゞを取埗しお远加するこずはできたせん。䜕らかの方法でこのデヌタを抜出し、登り、远加の゚ンティティをプロゞェクトに入力する必芁がありたす。 たた、必ずしも䟿利ではありたせん。







圌らが数か月前に発衚したFacebookリレヌは、コンポヌネント内のデヌタに察する特別なリク゚ストを宣蚀的に蚭定できるフレヌムワヌクです。 非垞に興味深い話、぀たり 芁求、必芁なデヌタ、それらが結び付けられおいる条件を宣蚀的に瀺したす。 リレヌはこのすべおのデヌタを蓄積し、すぐにサヌバヌにそれを投げたす、そしおあなたはそれをすべお䞀床に取埗したす。 ぀たり これは、先ほど説明したク゚リのバッチ凊理です。 唯䞀の問題は、これがサヌバヌでただ利甚できないこずです。 サヌバヌ偎ですが、2016幎の第1四半期には、Facebookは既にこれを実装するこずを玄束しおおり、すべおが機胜したす。 GitHubの問題ぞのリンクがありたす。ご芧ください。







Redux-catch-promiseは、1぀のプロゞェクトで働いおいる間に䜜った短い寿呜です。 Reduxずは䜕ですか MoscowJSで圌に぀いお話したした。 これは、Reactの状態コンテナヌです。 実際、これはFluxの代替品であり、瀺されおいるようにはるかに成功した代替品です。 スピヌチぞのリンクがありたす。 Redux-catch-promiseはミドルりェアです。 reduxのプラグむン。







圌は䜕をしおいたすか ストリヌム内のPromiseアクションをキャプチャし、アプリケヌションをレンダリングするためにコヌルバックを切りたす。 コンポヌネントをレンダリングするずきに、リク゚ストが行われたす。 デヌタを受信しお​​Promiseに応答しおディスパッチするアクションを送信したす。 このPromiseは、アプリケヌションをレンダリングする最䞊䜍でキャッチし、その結果、Promiseのコレクションを取埗したす。 その蚱可を埅っお、受信したデヌタでアプリケヌションを再レンダリングしたす。 ここでは、手動受信ず珟圚Relayに実装されおいるものずの劥協点である、非垞に䟿利な結果が埗られたした。







GitHubぞのリンクはここにありたす。䟋がありたすが、少し叀いかもしれたせんが、ここではすべおが非垞に迅速に倉曎されたす。



パフォヌマンスは2番目の郚分です。







サヌバヌサむドが通垞のMacBookでどれだけ速くレンダリングされるかを確認し始めたずき...



理解するために、このペヌゞは56 Kバむトを占有し、文字通り4぀の画面、小さなプロファむルで衚瀺されたす...























すべおのデヌタを䜿甚しお、テストのためにabを取埗したしょう。リク゚ストは完了です。 61ミリ秒。







それがたくさんあるのか、それずも少しなのかは明確ではありたせん。 同じように、Hendlebarsを実行するず、8ミリ秒になりたす。







違いはもっずはっきりしおいるず思いたすが、それはそれほどではありたせん。







私たちは䜕かを探し始め、芋お、Googleに行きたす-具䜓的なものは䜕もありたせん。 私たちはツむッタヌに尋ねようずしたす、誰もが黙っおおり、リツむヌトもしおいたすが、答えは芋぀かりたせん。



同時に、NODE_ENVを運甚環境に入れおみたしょう。







ロヌンチしお-バム -ほが2倍の速床。 玠晎らしい、面癜い。 良く芋えたすが、それでもケヌキではありたせん。







どうぞ 芋おみたしょう、GitHubの問題で登りたす。







「npm reactを䜿甚するずサヌバヌのレンダリングが遅くなる」などの興味深いものを芋぀けたしょう。 そこで、ファむルを明瀺的にreact.min.jsにむンクルヌドするだけでなく、むンポヌトおよびリアクションを行うだけでなく、接続する必芁があるずいう決定が䞋されたす。







では、詊しおみたしょう。 テスト甚にいく぀かのnode_modulesを䜜成したしょう。 枅朔さのためにそうしたす。 ここでは、min.jsを明瀺的に䜿甚したす。 そしお最埌に、これはどのように結果を倉えたしたか 始めたす。







さらに遅くなった。







テストが倱敗したスラむド。



結局のずころ、このアドバむスはReactの過去にはうたくいきたしたが、14日にはうたくいきたせんでした。 党䜓像は次のようになりたす。







぀たり Hendlebarsには8ミリ秒かかりたす。実際には、プロダクションを指定した堎合、それ以倖はすべお、玫-js minを䜿甚した堎合はすべおです。 わずか39少ない。



さらにいく぀かのグロヌバルな調査-サヌバヌ偎レンダリングのハックは芋られたせん。 Reactレベルでは、今のずころすべおを最適化する堎所はありたせん。 筋金入りの十分な方法しかありたせん。







これをグロヌバルに共有し、プリコンパむルずキャッシュを䜿甚するず、レンダリングが分離されたす。 たた、最近リリヌスされたReact DOM Streamプラグむンを䜿甚したす。 Facebookの䜿甚BigPipeは、Facebookの非垞に興味深い拡匵機胜であり、長い間䜿甚されおきたした。 HAProxyは、レポヌトの他のセクションであるdevopsに぀いお詳しく説明しおいたす。







プリコンパむルの本質は䜕ですか 実際、UIが状態の特定の関数を実行した結果であるずいう事実から開始する堎合-fstate、ここでfはReactコンポヌネントであり、状態-これは、ある皮の堎合、単なるパスになりたすサむトたたはペヌゞのツリヌ、たたは他の䜕かに結び付けるこずができたす。 レンダリングするこのキヌを䜿甚しお、HTMLを簡単にキャッシュできたす。



簡単な解決策は、redisを䜿甚するこずです。 すぐに迅速に察応する必芁がある堎合は、redis、キュヌ、ワヌカヌを䜿甚できたす。 ぀たり 䜕らかのホむヌルを瀺し、郚分的な読み蟌みを行い、バックグラりンドで、ワヌカヌはすべおのリク゚ストでコンポヌネントをレンダリングしたす。 ここで、最初のレンダリングがどこにあるかを取埗したす。本質的に、この堎合、ペヌゞはすぐに䞎えられ、すべおがバックグラりンドでレンダリングされ、次のリク゚ストで、コンポヌネントのキャッシュされた郚分をすでに䞎えるこずができたす。







レンダリングの分離。 Linkedinは調査を実斜したしたが、ほずんどのペヌゞ特に長いペヌゞでサヌバヌレンダリングを完党に行う必芁はなく、最初の郚分衚瀺されおいる郚分を衚瀺するだけで十分であるこずがわかりたした。 たた、他のすべおを個別にアップロヌドするこずもできたす。たずえば、クラむアント偎のJSです。 そしおほずんどの堎合、圌らは圌らの最初の郚分だけを芋たした、誰もスクロヌルしたせんでした、すなわち そのため、最初の郚分をサヌバヌにレンダリングしおすぐに提䟛できたす。次の郚分はすでにJSを介しおプログラムでダりンロヌドされおいたす。 これにより、パフォヌマンスずリ゜ヌスの面でかなり倧きな利点が埗られたす。







React DOM Streamは次の拡匵機胜です-これは最近公開されたプロゞェクトです。 男aickinはReactを分岐させ、そこに通垞のhttpなどの早期リセットのテクノロゞヌを実装したした。 レンダヌレンダリングしお、すぐにすべおが埗られたす。 この堎合、HTMLコヌドの圢匏ではなく、コンポヌネントがレンダリングされおいるため、すぐにストリヌムサヌバヌにダンプされるずきに、圌はすぐにテクノロゞを実装できたした。 非垞に興味深いパフォヌマンス効果が埗られたす。 最初のバむトたでの時間はすでに65短瞮されおいたす。 これはほが2倍で、最埌のバむトたで-37です。 これらの2぀のアプロヌチを組み合わせるず、非垞にうたくいきたす... React自䜓に圱響した唯䞀のマむナス点は、少し改善する必芁があるため、そこにフォヌクを䜿甚するこずで、これは公匏のReactではありたせん。 珟圚、このテヌマに関する議論がありたす。ご芧いただけたす。たもなく準備が敎いたす。







Facebook BigPipe。 非垞にクヌルな拡匵機胜。 圌らはそれを非垞に長い時間、玄2〜3幎前にしたした。 これは、読み蟌みプロセス䞭にペヌゞが組み立おられるずきです。 ぀たり すべおが私たちず䞊行しおロヌドされ、これから゚ラヌ耐性が埗られたす。 本質はこれです。ペヌゞがあり、プロセスで遞択しおロヌドできる特定の郚分がありたす。 ぀たり ペヌゞをロヌドする過皋で、これらのブロックに必芁なJS、CSSの呌び出しを圢成し、デヌタは䜕らかのjsonパむプを介しお自動的にロヌドされたす。







最初にレンダリングするず、このようなほが完党なペヌゞが衚瀺されたす。 たずえば、Yandexのように、重芁なものを芋るこずができたす。 Yandexでは、怜玢フレヌズを入力しおEnterキヌを抌すず、最初にリク゚ストのあるトップツヌルバヌが衚瀺され、その埌で結果自䜓が読み蟌たれたす。 ここにプロセスが描かれおいたす。







HAProxy。 DevOpsに぀いおは少しですが、DevOpsスペシャリストに誰もがアクセスできるようになったず思いたすが、埌で他の蚭定を行うこずもできたす。 芁点は、実皌働環境では、いく぀かのノヌドを䞊げお、それらの間で既に埪環させる方が良いずいうこずです。



結論ずしお、私はいく぀かの有甚な資料を提䟛したいず思いたす。



  1. ペヌゞ負荷の過絊100日間のGoogle Dev https://youtu.be/d5_6yHixpsQ
  2. Netflix.comの高速化http://techblog.netflix.com/2015/08/making-netflixcom-faster.html
  3. 新しいLinkedInホヌムペヌゞの新しいテクノロゞヌhttps://engineering.linkedin.com/frontend/new-technologies-new-linkedin-home-page
  4. twitter.comでのパフォヌマンスの改善https://blog.twitter.com/2012/improving-performance-on-twittercom
  5. 同圢JavaScriptコヌドのスケヌリングhttps://blog.nodejitsu.com/scaling-isomorphic-javascript-code/
  6. AngularJSからReactぞ同圢の方法https://blog.risingstack.com/from-angularjs-to-react-the-isomorphic-way/
  7. 同圢JavaScriptWebアプリの未来http://nerds.airbnb.com/isomorphic-javascript-future-web-apps/
  8. Reactサヌバヌ偎のレンダリングパフォヌマンスhttp://www.slideshare.net/nickdreckshage/react-meetup
  9. プログレッシブHTMLレンダリングの倱われた芞術https://blog.codinghorror.com/the-lost-art-of-progressive-html-rendering/


たた、掚奚事項ずしお、MoscowJSコミュニティに参加しおお楜しみに。







私たちには垞に面癜いこずが起こりたす。



最も重芁なこずは、あなたの英語を䞊達させ、英語のレポヌトを読み、「゜ビ゚トの新聞を読たない」こずです。 オリゞナルず技術ブログを読んでください。 同じ䌚瀟、Linkedin、Facebook、Netflixが非垞に関連性の高いものを曞いおいるずしたす。 これらの発衚はすべおTwitterでい぀でも芋るこずができたす。 そしお、Twitter、GitHubは、おそらくあなたが最新情報を把握し、フロント゚ンドの䞖界で䜕が起こっおいるのかを理解するための䞻芁なものです。



この点で私が本圓に気に入った匕甚を2぀挙げたいず思いたす。







「ほずんどのアルゎリズムの問​​題は、デヌタ構造を倉曎するこずで解決できたす。」 これは、RadioJSの問題の1぀でAndrei Sitnikが蚀ったものです。 そしお、ビデオの1぀で、「倉化は私たちの仕事です」、぀たり 倉化は私たちの仕事です。 これはGoogleのゞェむクが蚀った。



これで、埓来のシングルペヌゞアプリケヌションを攟棄する理由ず移動先に぀いおの質問に答えたこずを願っおいたす。 これは実際には芋た目ほど難しくはないので、この方向に進んでください。



連絡先



» DenisIzmaylov

Github

» Twitter



このレポヌトは、特別なセクション「 フロント゚ンド パフォヌマンス」の高負荷システムHighLoad ++の開発者の䌚議での最高のスピヌチの1぀のトランスクリプトです。



たた、これらの資料の䞀郚は、高負荷システムHighLoadの開発に関するオンラむントレヌニングコヌスで䜿甚されたすガむドは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。 私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。 接続しおください



さお、䞻なニュヌスは、 Frontend Confを含む8぀のカンファレンスを含む春祭り「 Russian Internet Technologies 」の準備を始めたこずです。 これは、負荷の高いシステムの開発者向けの専門的な䌚議です。 ずころで、デニスは圌女のプログラム委員䌚に含たれおいたす。



All Articles