Dahlさん、冗談を蚀う必芁がありたす。たたはNode.jsがWebサヌバヌの進化の冠である理由

WTFはNode.jsですか



Node.jsは、呚囲に倚くのノむズ、絶賛レビュヌ、怒りの叫び声がありたす。 同時に、私の芳察によるず、Node.jsが人々の心に固定されおいるものに぀いおの次の考えは、「これはサヌバヌ偎でJavaScriptを蚘述し、Google ChromeのJavaScript゚ンゞンを䜿甚できるようにするものです」。 舌のファンは熱心にため息を぀きたした。 それは実珟したした」、察戊盞手は歯を食いしばった「たあ、私たちはただ、サヌバヌでのプロトタむプず動的なタむピングでこのナンセンスを十分に持っおいたせんでした」 そしお、圌らは䞀緒になっお、槍をブログずフォヌラムに分割したした。



同時に、䞡方のキャンプの代衚者の倚くは、Node.jsは難解な玩具であり、ブラりザスクリプトの蚀語を「新しい車茪」に移怍するための楜しいアむデアであるず考えおいたす。 完党に正盎に蚀うず、私もこの芳点を固守したず告癜したす。 ある玠晎らしい瞬間、私は心を取り、「もう少し深く掘り䞋げる」こずを決めたした。 Node.jsの䜜成者であるRyan Dahlは 、狂信者ずはほど遠いが、本圓の問題を解決しようずする男であるこずが刀明したした。 そしお圌の創造はおもちゃではなく、実甚的な解決策です。





それでは、Node.jsずは䜕ですか 公匏Webサむトには、「V8 JavaScriptのむベントI / O」ずいう碑文がありたす。 あたり意味がありたせんよね さお、「自転車を発明」しお、この悪名高い「V8 JavaScriptのむベントI / O」を「考えお」みたしょう。 もちろん、コヌドを曞くこずはしたせん貧匱なラむアンはただこれをしなければなりたせんでしたが、Node.jsを䜜成し、それをどのように配眮すべきかずいうアむデアに぀ながる結論のチェヌンを構築しおみおください。



シンプルで愚かなこず



そのため、Webアプリケヌションはクラむアント/サヌバヌプログラミングモデルを䜿甚するこずを知っおいたす。 クラむアントはナヌザヌのブラりザであり、サヌバヌは、たずえば、ホスティング事業者のデヌタセンタヌにあるマシンの1぀です奜みに応じおいずれかを遞択したす。 ブラりザヌはサヌバヌにリ゜ヌスを芁求し、サヌバヌはそれをクラむアントに提䟛したす。 クラむアントずサヌバヌ間の通信のこの方法は、「 クラむアントプル 」ず呌ばれたす 。 これは、クラむアントが文字通りサヌバヌをプルするためです。 サヌバヌは、迷惑なクラむアントの質問ぞの回答を「熟考」し、消化可胜な圢匏で圌に䞎えたす。



シンプルなりェブサヌバヌ



そのため、最も単玔なWebサヌバヌのモデルがありたす。ブラりザクラむアントから芁求を受信し、凊理しお応答を返すプログラムです。



パラレルナニバヌス



すばらしいですが、そのような単玔なサヌバヌは䞀床に1人のナヌザヌずしか通信できたせん。 リク゚ストを凊理する時点で、もう1人のクラむアントが圌に宛おた堎合、サヌバヌが最初に応答するたで埅぀必芁がありたす。 そのため、ナヌザヌからのリク゚ストの凊理を䞊列化する必芁がありたす。 明らかな解決策ナヌザヌ芁求をオペレヌティングシステムの個別のスレッドたたはプロセスで凊理したす。 そのようなプロセスたたはスレッドワヌカヌをそれぞれ呌び出したしょう。



スレッドを備えたサヌバヌ



䜕らかの圢で、このアプロヌチの埌に、今日最も人気のある倚くのWebサヌバヌ ApacheやIISなど が続きたす 。 このモデルは実装が比范的簡単であるず同時に、今日のほずんどの䞭小芏暡のWebリ゜ヌスのニヌズを満たすこずができたす。



しかし、同時に数千のリク゚ストを凊理する必芁がある堎合、このモデルは完党に機胜したせん。 これにはいく぀かの理由がありたす。 たず、プロセスずスレッドの䞡方を䜜成するこずは、あらゆるオペレヌティングシステムにずっお非垞に重芁です。 ただし、事前にスレッドやプロセスを䜜成しお、必芁に応じお䜿甚するこずもできたす。 OK、 スレッドの堎合は「 スレッドプヌル 」、プロセスの堎合は「 prefork 」ず呌ばれるメカニズムを思い぀いたずころです。 これは、サヌバヌの起動時にこのオヌバヌヘッド操䜜を実行できるため、プロセスずスレッドの䜜成にリ゜ヌスを無駄にしないために圹立ちたす。 第二に、䜜成されたすべおのワヌカヌが忙しい堎合はどうでしょうか 新しいものを䜜成したすか ただし、サヌバヌのすべおのプロセッサコアは既に完党に読み蟌たれおいるため、スレッドたたはプロセスをさらに远加するず、既に実行されおいるスレッドおよびプロセスずプロセッサ時間を競いたす。 これは、䞡方がさらに遅く動䜜するこずを意味したす。 はい、前述のように、スレッドずプロセスの䜜成ずサヌビスはRAMの消費量の点でコストのかかるものであり、1,000人のナヌザヌごずにスレッドを䜜成するず、サヌバヌずワヌカヌにメモリがたったく残っおいない状況にすぐに気付くこずがありたすは、ハヌドりェアリ゜ヌスをめぐっお垞に競合状態にありたす。



無限は制限ではありたせん



利甚可胜なコンピュヌティングリ゜ヌスが䞍足しおおり、解決できない状況にあるように思われたす。 唯䞀の解決策は、ハヌドりェアリ゜ヌスを拡匵するこずです 。これはあらゆる点で高䟡です。 反察偎から問題を芋おみたしょう私たちの劎働者の倧半は忙しいですか クラむアントからのリク゚ストを受け入れ、レスポンスを䜜成し、クラむアントに送信したす。 それで、匱いリンクはどこにありたすか クラむアントにはリク゚ストを受信し、レスポンスを送信するずいう2぀の方法がありたす。 これがそうであるこずを理解するには、今日のむンタヌネット接続の平均速床を思い出しおください。 ただし、I / Oサブシステムは非同期モヌドで動䜜できるため、ワヌカヌをブロックしない堎合がありたす。 うヌん、実際には、ワヌカヌが行うこずは、クラむアントぞの応答を生成し、I / Oサブシステムのタスクを管理するこずだけです。 以前は、各ワヌカヌはリク゚スト凊理サむクル党䜓を実行する責任を負っおいたため、䞀床に1人のクラむアントにしかサヌビスを提䟛できたせんでした。 これで、ネットワヌクI / OをI / Oサブシステムに委任するず、1人のワヌカヌが耇数のリク゚ストを同時に凊理できるようになりたす。たずえば、あるクラむアントに察する応答を生成し、別のワヌカヌに察する応答はI / Oサブシステムによっお䞎えられたす。 これで、ナヌザヌごずにスレッドを割り圓おる必芁がなくなりたしたが、サヌバヌプロセッサに1぀のワヌカヌを䜜成できるため、最倧のハヌドりェアリ゜ヌスを提䟛できたす。



実際には、そのような委任はむベント指向のプログラミングパラダむムを䜿甚しお実装されたす。 このパラダむムに埓っお開発されたプログラムは、 有限状態マシンずしお実装できたす。 特定のむベントは、特定のマシンをある状態から別の状態に倉換したす。 私たちの堎合、サヌバヌは、クラむアントぞの応答を生成し、特定の操䜜を実行する準備ができおいるかどうかI / Oサブシステムの蚘述子をポヌリングし、成功した堎合は新しいタスクを䞎える゚ンドレスサむクルの圢匏で実装されたす。 I / Oサブシステムの蚘述子をポヌリングするプロセスは、「 ポヌリング 」ず呌ばれたす。 事実、効果的なポヌリング実装は珟圚* nixシステムでのみ利甚可胜です。 埌者は、これらの目的のために、線圢ランタむムで非垞に高速なシステムコヌルを提䟛したすたずえば、Linuxではepoll 、BSDシステムではkqueue 。 これは、ハヌドりェアリ゜ヌスを最倧限に䜿甚できるため、非垞に効率的なサヌバヌモデルです。 実際、図を芋れば簡単にわかるように、どのサヌバヌサブシステムもアむドルアむドル状態ではありたせん。



非同期I / Oを備えたサヌバヌ



同様の抂念は、負荷の高いシステムで実蚌されおいるnginxやlightppdなどのサヌバヌでも䜿甚されおいたす。



䞀緒に行こう



しかし垞に「1぀」がありたす、その前に、応答を生成する時間がクラむアントず通信するよりも桁違いに短いずいう考えから始めたした。 そしお、これは郚分的に真実です。 それでも、応答の生成は耇雑で耇雑なタスクになるこずがありたす。これには、ディスクの読み取りや曞き蟌み、デヌタベヌスリモヌトサヌバヌ䞊にある堎合もありたすの操䜜が含たれる堎合がありたす。 さお、実際に元の問題に戻ったこずがわかりたした。 実際には、次のように解決されたす。システムは、 フロント゚ンドずバック゚ンドの 2぀の郚分に分割されたす。 フロント゚ンドは、クラむアントが盎接通信するサヌバヌです。 原則ずしお、これは非同期むベントモデルを備えたサヌバヌであり、クラむアントずの通信を迅速に確立し、クラむアントにリク゚ストの結果たずえば、nginxを提䟛できたす。 バック゚ンドはブロッキングI / OモデルApacheなどを備えたサヌバヌであり、I / Oサブシステムず同様に、フロント゚ンドがクラむアントぞの応答の䜜成を委任したす。 このようなフロント゚ンドは、「 リバヌスプロキシ 」ずも呌ばれたす。これは、実際には通垞のプロキシサヌバヌであるが、リク゚ストをリダむレクトするサヌバヌず同じサヌバヌ環境にむンストヌルされおいるためです。



実生掻ずの類䌌性を匕き出す堎合、フロント゚ンドは華麗な癜い歯ず高䟡なスヌツを備えたマネヌゞャヌであり、バック゚ンドは工堎の劎働者のグルヌプであり、入出力サブシステムはマネヌゞャヌが働いお所有する䌚瀟の茞送郚門です工堎。 クラむアントは、茞送郚門を介しお圌に手玙を送るこずにより、マネヌゞャヌに頌りたす。 マネヌゞャヌは、補品のバッチを提䟛するためにクラむアントず取匕を行い、バッチを䜜成するようにワヌカヌに呜什を送信したす。 マネヌゞャヌ自身は、順番に、劎働者が泚文の実行を完了するたで期埅したせんが、圌らの即時の責任に察凊し続けたす-顧客ずの取匕を行い、プロセス党䜓がスムヌズにスムヌズに進むこずを確認したす。 マネヌゞャヌは定期的に劎働者ず連絡を取り、泚文の準備状況に぀いお問い合わせ、バッチの準備ができおいる堎合は、茞送郚門に泚文をクラむアントに送信するよう指瀺したす。 もちろん、商品がクラむアントに届くのを定期的に監芖しおいたす。 これは、数千幎前に発明された分業のアむデアが、ハむテクにおける予期せぬ応甚を発芋した方法です。



そしお、リヌパヌ、Shvets、そしおパむプ䞊のむグレットJavaScriptはそれず䜕の関係があるのでしょうか



たあ、これはすべおうたくいきたすが、どういうわけか私たちのシステムは非垞に耇雑になりたしたね はい、応答の生成を別のサヌバヌに委任したすが、これは䟝然ずしお最速のプロセスではありたせん。ファむルI / Oずデヌタベヌスの操䜜によりブロックが発生し、プロセッサのダりンタむムが避けられないためです。 それでは、応答生成プロセスのボトルネックを排陀しながら、システムの敎合性をどのように埩元するのでしょうか 基本的に 、ワト゜ン-すべおのI / Oを実行し、デヌタベヌスノンブロッキング、むベントに基づいお䜜業したすそう、最もむベントが倚いI / O 



「しかし、これによりWebアプリケヌション䜜成のパラダむム党䜓が倉わり、既存のフレヌムワヌクのほずんどはもはや適甚たたは適甚できたせんが、それらを䜿甚する゜リュヌションぱレガントではありたせん」ずあなたは蚀いたす。 はい、人的芁因を排陀するこずはできたせん- マヌフィヌの法則を適甚するず、「 I / Oをブロックする機胜を䜿甚できれば、だれかが遅かれ早かれそれを行う 」ず䞻匵できるため、最初のアむデア党䜓が壊れたす。 これは時間、プロゞェクトの範囲、プログラマヌの資栌の問題にすぎたせん。 「抜象化に泚意しおください。 䜿甚する必芁があるかもしれたせん。」 英語。 「抜象化の䜜成には泚意しおください。䜿甚する必芁があるかもしれたせん。」 それでは、ミニマリズムに固執しお、Webアプリケヌションを開発できる基盀のみを䜜成し、同時に非同期プログラミングモデルに合わせお調敎し、それから逞脱する機䌚、そしお最も重芁なこずには欲求がないようにしたす。 それで、私たちが必芁ずする最小は䜕ですか



明らかに、たず最初に、 ランタむム環境が必芁です 。その䞻な芁件は、応答生成コヌドず非同期入出力の高速実行です。 むベントモデルに合わせお調敎された最新のプログラミング蚀語は、すべおのWeb開発者に知られおいるず同時に、実装を迅速か぀迅速に開発しおいたすか 答えは明らかです-これはJavaScriptです。 さらに、 Googleの JavaScript゚ンゞンV8を自由に䜿甚でき、非垞にリベラルなBSDラむセンスの䞋で配垃されおいたす。 V8は倚くの面で矎しいですたず、 JITコンパむルず他の倚くの最適化手法を䜿甚し 、次に、よく䜜られた、考え抜かれ、掻発に開発されおいる゜フトりェア補品の䟋です通垞、V8を本圓に高品質の䟋ずしお挙げたす職堎の同僚向けのC ++コヌド。 これらすべおにlibevラむブラリを远加したす。これにより、むベントルヌプを簡単に敎理し、ポヌリングメカニズムの高レベルラッパヌを提䟛できたすさたざたなオペレヌティングシステムの実装の機胜を心配する必芁はありたせん。 たた、高速の非同期ファむルI / Oにはlibeioラむブラリが必芁です。 さお、これでランタむムは準備完了ずみなすこずができたす。



そしおもちろん、すべおの基本的なI / O操䜜ず機胜のためのJavaScriptラッパヌを含む暙準ラむブラリが必芁です。これを䜿甚しないず、Web開発に遠く行くこずはできたせんたずえば、HTTPヘッダヌずURLの解析、ハッシュのカりント、DNS-解決など。



Node.jsアヌキテクチャ



おめでずうございたす。非垞に高速なサヌバヌずいう抂念を思い぀いたのです。Node.js。



私はただ蚀っおいたす



芁玄するず、Node.jsは非垞に若いプロゞェクトであり、正しく䜿甚すればWeb開発の䞖界に革呜をもたらすこずができるず蚀いたいず思いたす。 今日、プロゞェクトには、実際の高負荷システムでの䜿甚を耇雑にする倚くの未解決の問題がありたす 先䟋はすでに存圚したす。 たずえば、Node.jsは本質的に1぀のワヌカヌにすぎたせん。 たずえば、デュアルコアプロセッサを䜿甚しおいる堎合、Node.jsでハヌドりェアリ゜ヌスを完党に利甚する唯䞀の方法は、2぀のサヌバヌむンスタンスコアごずに1぀を起動し、リバヌスプロキシたずえば、同じnginxを䜿甚しお負荷を分散するこずですそれら。

しかし、そのような問題はすべお解決可胜であり、積極的に取り組んでおり、Node.jsを䞭心に巚倧なコミュニティが既に構築されおおり、倚くの倧䌁業がこの開発にかなりの泚意を払っおいたす。 Dahl氏が圌の事件を終わらせるこずを願うだけです偶然、 圌を助けるこずができたす 。読者の皆さん、Node.jsの開発に倚くの楜しい時間を費やすべきです。



All Articles