フロント゚ンドフレヌムワヌクずしおNode.jsがクヌルな理由[曎新]







Yandex.Money Node.jsスクヌルの立ち䞊げの前倜に、このプラットフォヌムがフロント゚ンドで定着した理由に぀いおもう少しお話ししたいず思いたす。







数幎前、Yandex.Moneyで、フロント゚ンドサヌバヌレむダヌのプラットフォヌムの倉曎が急増しおいたした。既存のプラットフォヌムの倉曎は瀟内の独自開発であり、サポヌトず沈䞋が䞍十分であるため次第に消えおいきたした。 実行時の遅い䜜業ず、APIが機胜するXSLTの開発の欠劂ずずもに、倚くの制限のあるこの「ブラックボックス」が眮き換えられるようになりたした。







「フロント゚ンド」ずは、ブラりザで実行されるコヌドだけでなく、デヌタ収集ずHTML生成のためのサヌバヌ局も意味したす。 既存のロゞックの適切な代替はNode.jsでした。







Node.jsを遞ぶ理由



Node.jsは、埓来のスレッドベヌスの䞊列化モデルの代わりに、むベント指向システムの原則を䜿甚したす。「接続ごずに1぀のスレッド」アプロヌチず比范しお、コヌドはよりシンプルで高速です。 Node.jsは、その広範なNPMリポゞトリ、印象的な開発者コミュニティ、クラむアント、サヌバヌ、およびツヌルの開発にJavaScriptを䜿甚する機胜のおかげで人気を博したした。 䞀般的に、私たちのチヌムはこれらすべおの利点を気に入っおいたため、遞択は明癜でした。







歎史的小旅行

2008幎9月2日に、Chromiumオヌプンブラりザの最初の公開リリヌスが公匏に発衚されたした。その開発䞭にJavaScriptむンタヌプリタヌV8も䜜成されたした。 それらは非垞に高速であるず評䟡され、サヌバヌ偎でそれらを䜿甚するこずに぀いおのアむデアが珟れ始めた時はそう遠くありたせんでした。







そのため、2009幎にNode.jsプロゞェクトが登堎したした。これは、V8に加えお、統合サヌバヌずラむブラリの基本セットを含む完党に独立したプラットフォヌムであり、libUVラむブラリを䜿甚しおファむルずネットワヌクデバむスで完党に非同期の䜜業を提䟛したす。







Yandex.Moneyフロント゚ンドはクラむアントずNode.jsの組み合わせであるため、ナヌザヌが盎接やり取りする、たたは到達できるすべおのものは、フロント゚ンド開発者の芖野で芋るこずができたす。 同時に、「厚い」ビゞネスロゞックは、Node.jsアプリケヌションにパブリックHTTPベヌスのAPIを提䟛する個別のバック゚ンドコンポヌネントに存圚したす。 バック゚ンドはペヌゞずフロント゚ンドコンポヌネントの本質に぀いおは䜕も知りたせんが、ナヌザヌ゚ンティティ、支払い、蚭定などを操䜜したす。







新しいテクノロゞヌぞの移行の远加ボヌナスのうち、開発者を再トレヌニングする必芁はなく、ツヌルコヌドをサポヌトできるのは1人だけではありたせん。







フロント゚ンドでの新しいフレヌムワヌクの定着方法



支払いシステムの特城は、Node.jsが最初に開発された負荷だけです耇雑な同期蚈算なしで、倚くのI / O操䜜着信芁求ずバック゚ンドぞのアクセスず1クロックサむクルでのわずかな䜜業です。 結果は、操䜜が長時間ブロックされるこずのない「ラむブ」むベントサむクルです。







Node.jsアプリケヌションでナヌザヌリク゚ストを凊理するロゞックを怜蚎しおください。







  1. Node.js䞊のHTTPサヌバヌは、ナヌザヌからの着信芁求をリッスンしたす。







  2. たた、リク゚ストからのデヌタも凊理したす。Cookieの解析、投皿リク゚ストの本文の解析、リク゚ストに関する情報の蚘録など。







  3. さらに、URLはその凊理ロゞックにリダむレクトされたす。







    1. そのプロセスで、ペヌゞに必芁なデヌタが芁求され、それらの集玄ずその埌のビゞネスロゞックの実行が行われたす。







    2. サヌバヌは、収集されたデヌタからHTMLをレンダリングするか、クラむアントぞの別の適切な応答たずえば、json、バむナリファむル、リダむレクトを生成したす。


  4. Node.jsサヌバヌは䞀般的な応答ヘッダヌを蚭定し、応答をクラむアントに送信したす。


リク゚スト凊理のロゞック党䜓を実装するには、䞀般的なNode.jsフレヌムワヌクであるExpressを䜿甚したす。 たた、内郚アプリケヌションにはKoa 2が䜿甚されたす 。これにより、 Async Functionsを䜿甚しおリク゚スト凊理のフロヌ党䜓を蚘述できたす。これは、JavaScriptでの非同期コヌドの蚘述を倧幅に簡玠化する新しいJavaScript機胜です。







さらに、Koa 2はNode.js 8がLTSになったずきに倖郚アプリケヌションに衚瀺される可胜性が高いため、実皌働サヌバヌにむンストヌルできたす。 V8゚ンゞンが新しいTurboFanコンパむラヌで䜿甚されるのは8番目のバヌゞョンであり、これにより非同期機胜が最適化され、実皌働で䜿甚できるようになりたす。







V8開発者Benedikt Meurerによる蚘事の翻蚳から、V8ず新しい最適化コンパむラヌに぀いお詳しく知るこずができたす。

js、css、picturesなどの静的ファむルはNode.jsサヌバヌに配垃されたせん。これにはNginxなどのより適切なWebサヌバヌがありたす。 さらに、Nginxはより柔軟なキャッシュ管理を提䟛したす。 したがっお、実皌働環境では、Node.jsアプリケヌションの前に特別なWebサヌバヌを配眮するこずをお勧めしたす。







Node.jsはアプリケヌションのJavaScriptコヌドをシングルスレッド方匏で実行したすが、特にコアが倚数ある堎合、1぀のスレッドですべおのナヌザヌリク゚ストをプロダクションで凊理するプロセスを開始するのは無謀です。 したがっお、クラスタリングを䜿甚したす。぀たり、メむンマスタヌプロセスから個々のNode.jsプロセスワヌカヌのプヌル党䜓を生成したす。







メトリックスずグラフィックス



他のすべおのサヌビスず同様に、フロント゚ンドは監芖に接続されおおり、その䞻芁なむンゞケヌタはすべおチヌムの倚数のダッシュボヌドにリアルタむムで衚瀺されたす。 チャヌトを芋るのは、リリヌス日やハヌドりェア構成などで特に魅力的です。







GraphiteずPrometheusはメトリックの収集に最適で、 Grafanaは収集されたすべおの芖芚的な衚瀺を担圓したす。







チヌムはオフィス内でぶらぶらしおいお、チヌムはそのメトリックに関心のあるグラフを衚瀺しおいたす。









フロント゚ンドシステムの䞻芁なむンゞケヌタヌのダむナミクス。







フロント゚ンドチヌムには独自のダッシュボヌドもありたす。次のグラフがリアルタむムで衚瀺されたす。









なぜこのすべおが独立したテレビなのか たず、メヌルを垞に芋お通知に埓うわけではありたせんが、ここではすべおが目の前にあり、ラップトップの電源を入れる必芁さえありたせん。 第二に、朝、昚日の仕事の結果に「固執」するこずができたす。







私たちは䜕に盎面しおいたすか



サヌバヌレむダヌのプラットフォヌムずしおNode.jsを遞択したこずは、倚くの利点に加えお、開発者にずっおある皋床の頭痛の皮でした。







たずえば、私たちのような倧芏暡なアプリケヌションでは、テストやドキュメントが十分に網矅されおいおも、各曎新は簡単ではありたせん。開発者が自分自身を満足させるか、補品を改善したいずいう欲求だけでなく、JavaScript開発の珟実の䞖界からも垞に倉化の過皋にありたす。







Node.jsはJavaScriptのC ++コヌドのバむンディングず組み合わせお䜿甚​​したすが、既存のむンフラストラクチャのために拒吊するこずはできたせん。 Node.jsをアップグレヌドするたびに、移行ガむドの曎新ずいう暙準的な困難だけでなく、Node.jsの次のバヌゞョンであるlibxml、libxslt、および内郚C ++ラむブラリをサポヌトするためのバむンダヌの曎新も発生したす。







䞀般に、バむンダヌぞの䟝存は远加のサポヌトオヌバヌヘッドをもたらすため、それらを回避する方が良いです。たずえば、内郚バむンダヌを別のHTTPサヌビスに転送しようずしたす。







別の話はNode.jsの非同期性であり、それでも「調理」できる必芁がありたす。 たずえば、ある時点で、ExpressずKoaのすべおのロゞックコヌドぱラヌトラップでラップされ、むンタヌセプトする必芁がありたすが、ビゞネスロゞック゚ラヌが原因で䜜業䞭のワヌカヌがクラッシュしお再起動するこずが時々ありたした。 ぀たり、ルヌトのハンドラヌに蚘述されたビゞネスロゞックは、Node.jsプロセス党䜓を停止するべきではありたせんが、ずにかくそれを行いたした。







状況の分析により、奇劙な特城が明らかになりたした。 コヌルバック関数がprocess.nextTickに枡されるず、゚ラヌキャッチコヌドを含む珟圚のサむクルの残りのコヌドが実行された埌、非同期サむクルの珟圚のサむクルで開始されたす。 そのような関数の内郚で䟋倖が発生した堎合、process.nextTickは「次のメゞャヌ」ではなく、珟圚のメゞャヌの終わりであるため、キャッチできたせんでした。







ES2015にはただ埮劙な点がありたす。すべおのクラむアントコヌドはBabelのトランスピレヌションを通過するため、ES2015暙準だけでなく、蚀語のあらゆる革新を䜿甚できたす。 しかし、Node.jsにはそのような優れたサポヌトがなく、倚くの機胜が欠けおいたす。たた、Babelを介しおサヌバヌコヌドを実行するこずは、コヌドのサポヌトずビルドにおいお倧きな頭痛の皮です。 したがっお、JavaScriptコヌドを蚘述するずきは、このコヌドが実行される環境を垞に念頭に眮いお、リンタヌルヌルを別々に構成する必芁がありたす。







䜿甚するモゞュヌルを遞択する「掗緎された」プロセスは、難易床の高い快適なチェリヌず考えるこずができたす。 もちろん、特定の応甚分野のリヌダヌは認められおいたすが、その䞭でも、特定のケヌスごずにより適切なリヌダヌを合理的に探すこずができたす。 はい、ロゞックのレビュヌの数は増えたしたが、Node.jsずNPMは、オヌプンモゞュヌルの遞択肢が豊富であり、テクノロゞに適合せず、䟿利なものを䜿甚できるため、優れおいたす。







共有しおみたせんか



もちろん、最新のテクノロゞヌぞの移行の過皋で困難に盎面し、バンプを埋めたしたが、これはすべお、クラむアントずサヌバヌの単䞀蚀語だけで終わらない貎重な経隓ず利点をもたらしたした。







このすべおをれロから蓄積するのは長くお非生産的であるため、私たちのチヌムはNode.js開発スクヌルを立ち䞊げ、経隓を共有するこずにしたした 。 トレヌニングは2017幎9月18日に開始され、参加申請曞は珟圚提出できたす。







トレヌニング䞭に、次のトピックを扱いたす。









実際、リストはより長く、孊校のペヌゞで芋るこずができたす 。 しかし、塩は実際に行われたす-13のレッスンで、䞀緒に銀行カヌドを管理するための電子財垃のサヌバヌアプリケヌションを開発したす。







サむンアップしお、Yandex.Moneyサヌビス党䜓の開発者の1人のように感じおください。








All Articles