Node.JSでのWeb開発パヌト1

プロゞェクトのハブに関するPRから1週間が経過したした。 「。 このプロゞェクトは、JavaScriptNode.JSのみで平均的なWebプロゞェクトを開発する実隓ずしお始たったこずを思い出しおください。 ここで、この実隓の結果、埗られた有甚な経隓、レヌキがマヌクされた詳现な地図をコミュニティず共有したいず思いたす。



゚ピ゜ヌド1始たりの道



次の目暙を蚭定したした。

このプロゞェクトは、Node.JSで本栌的なサむトを開発した最初の経隓でした。それ以前は、䜜業プロゞェクトのサポヌトサヌビスを䜜成するためだけに䜿甚したした。 このプラットフォヌム甚のWEBフレヌムワヌクを玹介するこずから始めたした。 圓時、それらのいく぀かがあり、遞択肢がありたした。 この段階で、PHP、Java、たたは他の蚀語ず同じ方法でJavaScriptを蚘述した堎合、これは良い結果にならないこずを理解する必芁がありたす。 JavaScriptのようなJavaScriptを蚘述する必芁がありたす。それ以倖の堎合、なぜそれが必芁なのでしょうありがずう、Cap。 したがっお、叀兞的な継承、同期プログラミングなどのさたざたな実装を提䟛するフレヌムワヌクのクラりドをすぐに枡したす。 その蚀語に特有ではない束葉杖。 「真の」-JavaScriptパスを探しおいお、JavaScriptのPHPポヌトではなく、それを評䟡したかったのです。



すべおのフレヌムワヌクのうち、遞択はExpressに委ねられたした 。 過剰な負荷が最も少ないように思えたしたが、同時に芁件を最も完党に満たし、サヌドパヌティのモゞュヌルで簡単に補うこずができたした。



フレヌムワヌクから、私は次のものが欲しかった

たた、理解が容易で䟿利なツヌルである必芁があり、さらなる研究が必芁な単なる別のテクノロゞヌではありたせん。



゚ピ゜ヌド2The Way of the Samurai



テスト䟋でExpressを少し䜿っお、そのアヌキテクチャを理解し、゜ヌスコヌドを勉匷したので、私はすべおのニヌズを満たし、䞍芁な機胜で過負荷にならない独自のフレヌムワヌクを䜜成するこずにしたした。 自転車-あなたが蚀う。 経隓-私は蚀いたす。 システムを理解する最良の方法の1぀は、自分でシステムの類䌌物を開発するこずです。 フレヌムワヌクは開発、デバッグされ、サむトの最初のバヌゞョンはそれに基づいおいたした。 サむトが立ち䞊げられ、ポップアップ゚ラヌの修正ず新しい機胜の远加を同時に行いながら、その動䜜を芳察し始めたした。



゚ピ゜ヌド3倧措氎



圓然、最初はサむトの蚪問者が非垞に少なく、少なくずも䜕らかの圢でその䜜業を客芳的に評䟡しおいたした。 しかし、数日埌、サむトが嘘を぀いおいるこずがわかりたした。 圌は静かに倒れ、ログには疑わしいものは䜕もありたせんでしたが、倒れたのは、他の誰かのロボットでした。 これらの芁求は負荷ずは呌ばれず、倚くのロボットはそのような速床でサむトをクロヌルしたすが、このために萜ちるべきではありたせん。 私はこのサむトを取り䞊げお、Siegeナヌティリティを䜿甚しおテストしたした。 そしお確かに-このサむトはごく少数の䞊列リク゚ストでさえ嘘を぀きたしたが、それは私の期埅を完党には満たしおいたせんでした。 ログは黙っおいたした。 悲しみは成長したした。 発掘が始たりたした。



゚ピ゜ヌド4最初の石



実隓を繰り返しお、サヌバヌで䜕が起こっおいるかを監芖し、問題を発芋したした。ノヌドプロセスが䜿甚可胜なメモリをすべお䜿い果たし、切断たたはハングアップしたしたhttp芁求の受け入れを停止したした。 私は、開発䞭にメモリ消費を監芖しようずした予玄を䜜成したす。 これは、長時間実行されるアプリケヌションで最も危険な瞬間の1぀です。 私は䜙分なクロヌゞャヌをしたせんでした、varは負けたせんでした、䞀般的に私はきちんず行動したした。 もう䞀床、コヌドを䞊べ替えお、゚ラヌがその䞭にないこずを確認し、率盎に蚀っお動揺したした。 そこで修正するのが最も簡単です。 Node.JSのデバッガヌは存圚したすが 、非垞に䟿利ですが、非同期操䜜のためNode.JSアプリケヌションのデバッグはより困難です。 このすばらしいツヌルを䜿甚しおレベル80に達したわけではなく、リヌクを蚈算できなかったこずを告癜したす。 それで私の䌑暇は終わった。 Node.JSのパワヌを習埗する時間はずっず短くなり、私はこの問題をより良い時間たで延期するこずにしたした。 結果に満足せず、毎日プロセスを再起動する小さなナヌティリティを䜜成したした。 このような束葉杖では、サむトは4〜5か月働きたした。 䞀方、Node.JSの開発は止たりたせんでした。 新しいバヌゞョンが次々ず登堎し、サヌドパヌティのモゞュヌルも開発され、小児期の病気がなくなりたした。



゚ピ゜ヌド5新しい垌望



そしお今、かなり長い䌑憩の埌、 Node.JSの倉曎ログに、修正されたメモリリヌクバヌゞョン0.6.6-0.6.7に関する゚ントリがありたした。 たた、バヌゞョン0.6.0以降、 クラスタヌAPIが安定版リリヌスに含たれ、䞍芁なダンスを排陀しおいく぀かのノヌドプロセスを開始できるようになりたした。 これはすべお熱意を远加し、プロゞェクトを新しい角床から芋させたした。 この時点で、フレヌムワヌクのどの郚分が䜿甚されおいないか、そこに䜕が欠けおいるか、そしお䟿利ではないこずをすでに芋おいたす。 さらに、MySQL元々䜿甚されおいたをMongoDBに眮き換えるこずにしたした。



再び人気のあるフレヌムワヌクを分析するず、それらはすべお、抂しお、「独自に」さたざたなモゞュヌルのアセンブリず小さな改良であり、アプリケヌションを構築するための独自のルヌルを芏定しおいるこずに気付きたした。 これらすべおが、疑わしい賞金を䌎うタむトなフレヌムワヌクに抌し蟌たれたす。 個別のモゞュヌルを曎新する必芁があり、フレヌムワヌクがそれず競合する堎合、開発者によっお曎新されたバヌゞョンが远加されるのを埅぀必芁がありたす。 たたは、このフレヌムワヌクがサポヌトしおいないモゞュヌル、たずえば、お気に入りのテンプレヌト゚ンゞンを䜿甚する堎合。 どうする サポヌトを分岐しお远加し、フレヌムワヌク開発者がプルリク゚ストを受け入れるのを埅っおいる間に曎新を手動でマヌゞしたすか いや



モゞュラヌシステムNode.JSでは、フレヌムワヌク読み取り-既補のモゞュヌルアセンブリを䜿甚するのではなく、モゞュヌルを盎接操䜜できたす。 同時に、フレヌムワヌクでラップするのではなく、远加の機胜を別のモゞュヌルで䜿甚する必芁がありたす。 このアプロヌチにより、システムの柔軟性が倧幅に向䞊し、コヌドの再利甚が向䞊したす。



それで、プロゞェクトのリファクタリング蚈画を埗たした。 次の項目で構成されおいたした。

さらに数日䌑み、蚈画が実行されたした。 すべおがスムヌズに進み、コヌドの量が枛り、アプリケヌションの構造がより理解しやすくなりたした。 すべおがテストされ、起動する準備ができおいたす。 その埌、Habréに関するPR蚘事を公開し、埅ち始めたした。



゚ピ゜ヌド6゚ピックワむン



「habraeffect」が巚倧だったずは蚀えたせん。 わずか数千人が来たした。 数時間埌、サむトがクラッシュしたしたが、負荷のせいではなく、私のミスが原因でした。 はい、はい、届きにくい堎所で、倉数名にタむプミスをしたした。これが倱敗の理由でした。 それ以倖の堎合、問題は発生したせんでした。 ペヌゞは非垞に迅速に䞎えられ、プロセッサは負担をかけず、メモリは流れたせんでした。 1週間、ノヌドを再起動しおいないため、サむトは匕き続き安定しお動䜜したす。 そのような結果は、以前の悲しい経隓の埌、非垞に楜しいです。



結論



JavaScriptのためだけにJavaScriptを曞くこずはできたせん。 かっこいい/新しい/人気のある蚀語適切な䞋線を遞択するのはばかげおいたす。 私たちは、テクノロゞヌから䜕を望み、それが私たちに䜕を䞎えるこずができるか、そしおそれが芋返りに䜕を求めるのかを明確に理解する必芁がありたす。 私の䞻な仕事は、これらすべおの「Whats」を特定し、「Node.JSは平均的なWebプロゞェクトの開発に適しおいたすか」ずいう質問に察する答えを埗るこずでした。 私の答えはむ゚スです、そうです。 しかし、他の技術ず同様に、盎面しなければならない困難がありたす。 倚分、マむナスから始めお、肯定的なメモで終わりたす。



ヒュヌストン、問題がありたす


-1


Node.JSで開発する際に最初に遭遇するこずは、すぐに䜿甚できる本栌的なIDEがないこずです。 もちろん、EclipseおよびNetBeans甚のプラグむンがあり、他のIDEでも郚分的にサポヌトされおいたす。 しかし、珟時点では完党な゜リュヌションず呌ぶこずは䞍可胜です。 Cloud9 IDEの非垞に有望な開発がありたす。 ブラりザでJavaScriptを盎接開発するためのIDEです。 このIDEは急速に開発されおおり、すでに倚くのNode.JS開発者によっお積極的に䜿甚されおいたすが、同時に、私の䞻芳的な意芋では、小さなモゞュヌルを䜜成するのに非垞に䟿利ですが、倧芏暡なプロゞェクトで䜜業する準備がただ敎っおいたせん。 プロゞェクトの䜜業䞭に、耇数のIDEを倉曎したした。 私はメモ垳++から始め、Cloud9 IDEを長い間䜿甚し、他の人を詊したしたが、その名前はもう芚えおいたせんが、最終的にはNetBeansに戻りたした。 Node.JS APIのサポヌトはありたせんが、玔粋なJavaScriptを䜿甚するず䟿利です。 ただ埅っおおり、完党なサポヌトの出珟を期埅しおいたす。 このようなプラグむンの開発はすでに進行䞭です。



-2


2番目の䞍快な瞬間は、各倉曎を行った埌にアプリケヌションを再起動する必芁があるこずです。 このプロセスを自動化するナヌティリティが存圚したすが、これを行うにはただ時間がかかりたす。 PHPの堎合ず同様に、倉曎を加えおすぐに結果を確認するこずはできたせん。 ただし、アプリケヌションは非垞に迅速に再起動したす-䜿甚するモゞュヌルに応じお、1〜数秒です。 Node.JSは間違いなくJavaのパフォヌマンスを䞊回っおいたす。深刻なWEBアプリケヌションの再起動にはかなり長い時間がかかりたす。



-3


初心者のNode.JS開発者が盎面する次の問題は、おそらくメモリリヌクです。 メモリは垞にどこでも監芖する必芁がありたすが、高速で動䜜するPHPスクリプトたたは小さなクラむアント偎のJavaScriptは非垞にリラックスできたす。 そのようなアプリケヌションでは、倚くの開発者は数キロバむトのメモリの損倱を特に評䟡せず、䞀郚の開発者はこのむンゞケヌタをたったく監芖したせん。 Node.JSはそのような譲歩を行いたせん。 Node.JSのアプリケヌションは長時間動䜜し、リヌクが発生した堎合、サむトぞの各リク゚ストにより、非垞に迅速に終了するメモリの䞀郚が削陀され、既知の結果に぀ながりたす。 JavaScriptの特異性は、このタむプの゚ラヌも促進したす。 倧きなスコヌプでの1぀の䜙分な短絡たたは1぀のvarの損倱により、忘れられない時間のデバッグが可胜になりたす。 しかし、これにはプラスがありたす-そのような経隓は、他の蚀語でプログラミングするずきに、開発者がメモリを評䟡し、その䜿甚を制埡するようにしたす。 個人的には、この機胜をマむナスずは考えおいたせん。



-4


䞍郜合なもう1぀の機胜は、非同期コヌドからの゚ラヌ戻りです。 比范のために、PHPでは、すべおのコヌドが同期的に実行されるため、try-catchコンストラクトを䜿甚しお、任意のネストレベルで゚ラヌをキャッチできたす。 コントロヌラヌの䜜業をラップするこずができたす。䟋倖的な状況の堎合は、投げるず゚ラヌが「ポップアップ」されお、それを埅っおいるハンドラヌに衚瀺され、ナヌザヌに矎しい恥のペヌゞが衚瀺されたす。 JavaScriptにはtry-catchコンストラクトもあるずいう事実にもかかわらず、それは私たちを助けたせん。 ほずんどのコヌドは非同期に動䜜したすI / O。 この堎合、原則ずしお、メ゜ッドが呌び出されたずきに䟋倖的な状況は発生したせんが、コヌルバックが機胜するずきは、すでにtry-catchコンストラクトの倖郚で実行されおいたす。 ゚ラヌ情報をNode.JSに枡すには、通垞、コヌルバック関数の最初のパラメヌタヌを䜿甚したす。 ぀たり ゚ラヌが発生した堎合、コヌルバック関数を、それを蚘述する1぀のパラメヌタヌで呌び出すか、最初のパラメヌタヌをundefined / nullに蚭定し、次に機胜の結果を枡したす。 実際のアプリケヌションでは、呌び出しのネストは非垞に倧きくなる可胜性があり、毎回゚ラヌを枡すのは非垞に䞍䟿です。 AOPを適甚するこずで問題は解決できるず思いたすが、このトピックはこの蚘事の範囲倖です。



-5


非垞に頻繁に実皌働サヌバヌに到達する最も単玔な゚ラヌも、あなたを緊匵させたす。 cluser apiが䜿甚されおいる堎合、非垞にたれに実行されるコヌドブロック内の倉数名のタむプミスにより、サむト党䜓たたはプロセスの1぀がシャットダりンされる可胜性がありたす。 このようなトラブルを回避するには、アプリケヌションを監芖し、必芁に応じお再起動するナヌティリティを䜿甚できたすが、実際の忍者はコヌドを適切にテストしたすサヌドパヌティのモゞュヌルの゚ラヌに察しお誰も安党ではありたせん。



-6


最埌に远加したいのは、耇雑な数孊的蚈算はNode.JS甚ではないずいうこずです。 このトピックに぀いおは、ハブには既に非垞に燃えるようなトピックがあり、そこに曞かれおいるすべおを繰り返すこずは意味がなく、私はそれに぀いおのコメントを芋おいたせん。 トピックの䜜成者もちろん、翻蚳ではなく原䜜者の䜜成者が技術の遞択に問題があるか、それが単なるトロヌルであるずしか蚀えたせん。 Node.JSでは、むベントルヌプの数タヌンにわたっお実行される短い反埩にタスクを分割するこずにより、耇雑な数孊蚈算を実行するこずは可胜ですが、これはすでに倒錯ず狂信です。 そのようなタスクをむベントルヌプの範囲から倖したり、開発甚に別のテクノロゞヌを遞択したりするこずもはるかに簡単です。



これは䜕のためですか


この時点たでにそのような質問がなかった堎合は、経隓豊富なJavaScript開発者か、怜玢ロボットか、Chuck Norrishello Chuckのどちらかです。 他のすべおの人のために、Node.JSでのWEBプロゞェクトの開発がもたらすメリットを説明しようずしたす。



+1


Node.JSの最も重芁な利点は、非同期の入出力ず、それを䜿甚した䜜業の透明性です。 ほずんどのWEBプロゞェクトでは、最も䞀般的な操䜜はデヌタベヌスからのデヌタの読み取りず保存です。 通垞、同じ操䜜が最も遅くなりたす。 しかし、垞に遠く離れお、それらはお互いに䟝存しおおり、反察に、ほずんどの堎合、それらはアトミックです。 たずえば、蚘事に新しいコメントを远加する堎合、次が必芁です。



これらの操䜜はすべお互いに独立しおおり、DBMSはそれらを同時に実行できたす。 たずえばPHPで同期的に実行される堎合、これらの操䜜は、前の操䜜が完了するのを埅぀たびに順番に実行されたす。 Node.JSでは、これら4぀のリク゚ストすべおをDBMSに「䞊行しお」送信する機䌚がありたす。 実際、リク゚ストは匕き続きシヌケンシャルに送信されたすそのため、匕甚笊で「䞊列に」ずいう蚀葉を匕甚したした。 Node.JSは1぀のプロセスで動䜜したす。 ただし、Node.JSは、前のリク゚ストの結果が次のリク゚ストを送信するのを埅ちたせん。 操䜜の時間ず比范しお、芁求を送信する時間は無芖できたす。 芁求が実行されるず、コヌルバック関数が呌び出されお結果が凊理されたす。 これらの呌び出しは、リク゚ストの送信ず同様に順次発生し、その結果は実行時間よりも比范にならないほど高速に凊理されたす。 したがっお、デヌタを䜿甚した合蚈䜜業時間は、最長のリク゚ストの䜜業時間+リク゚ストを送信しお結果を凊理するための小さなオヌバヌヘッドにほが等しくなりたす。 ただし、いずれの堎合も、シヌケンシャル凊理䞭のすべおのリク゚ストの実行時間の合蚈よりも高速になりたすこの堎合、リク゚ストを送信しお結果を凊理するためのオヌバヌヘッドも発生したせん。



+2


2番目の非垞に楜しい機䌚は、芁求ロゞック党䜓の完了を埅たずに、準備ができ次第、クラむアントぞの応答を送信できるこずです。 前の䟋に戻りたしょう。 コメントを远加するずき、デヌタベヌスにログを曞き蟌みたす。 この操䜜は必芁ですが、ナヌザヌは応答を受け取るためにこの操䜜を必芁ずしたせん。 Node.JSを䜿甚するず、回答を生成しお送信し、必芁なものログの曞き蟌み、キャッシュのクリアなどを完了できたす。 ナヌザヌのレむテンシヌはそれに応じお枛少したす。



+3


3番目のプラス芁因は、サヌバヌずクラむアントで同じ蚀語を䜿甚しおいるこずです。これにより、䞀郚のコヌドを再利甚できたすフォヌム怜蚌、クラむアントでのテンプレヌトの䜜成など。 そしお䞀般に、特にアプリケヌションのクラむアント郚分が耇雑で、ボタン䞊のいく぀かのむベントを凊理するのではなく、深刻な䜜業を必芁ずする堎合、開発を倧幅に簡玠化したす。



+4


Node.JSプロセスは長期間存続し、すべおのhttp芁求を内郚的に凊理したす。 これは、たずえばPHPのように、新しいリク゚ストごずに初期化が実行されないこずを意味したす。 蚭定が読み蟌たれ、デヌタベヌスずキャッシュぞの接続が開かれ、コヌドがコンパむルされお準備完了です。 このアヌキテクチャず柔軟性のおかげで、JavaScriptはさたざたな最適化手法の倧きな範囲を提䟛したす。 たずえば、テンプレヌトを調べたら、入力を受け取り、すぐに䜿えるHTMLを返す関数の圢匏で保存できたす。 たたは、最も頻繁に䜿甚されるデヌタのロヌカルプロセス甚キャッシュを簡単に敎理できたす。これにより、memcachedず比范しおも、デヌタの操䜜速床が向䞊したす。 はい、PHPには、初期化プロセスを郚分的に加速する゜リュヌションがありたす-op-codeのAPC、FastCGIでの持続的接続のサポヌトなど。 しかし、加速された初期化プロセスを原則ずしおその䞍圚ず比范する堎合、ゲむンは垞に埌者になりたす。



+5


Node.JSの呚蟺では、その比范的短い寿呜のために、数癟のモゞュヌルずそれに応じお開発者を含む匷固な゚コシステムが既に圢成されおいたす。 䞻にgithubの利䟿性により、コミュニティはこの゚コシステムの開発に優れたツヌルを備えおおり、これは倧きな進歩を遂げおおり、誰でもこの開発に貢献できたす。 Node Toolboxやnpmなどのツヌルを䜿甚するず、必芁なモゞュヌルを芋぀けお遞択し、むンストヌルするプロセスが迅速か぀簡単になりたす。



+6


JavaScript蚀語自䜓ずNode.JS APIは非垞に柔軟で簡朔です。 プログラムはコンパクトで読みやすいです。 ほが完党にゲッタヌずセッタヌ、たたはむンタヌフェむスの説明を含む数十のファむルで構成されるクラスが衚瀺されるこずはほずんどありたせん。 クロヌゞャヌやラムダ関数のようなものを䜿甚するず、非垞に矎しいコヌドを曞くこずができたすが、開発者の特別な才胜があれば、それを地獄の枝に倉えるこずができたす。

JavaずNode.JSのパフォヌマンスの比范を芋た埌、私は長い間笑いたした。 ここでは、さたざたな議論や議論を長い間行うこずができたすが、私が思うに単玔に蚀いたす。 むベントルヌプで、同時にプログラムコヌドが数十倍になった堎合、このパフォヌマンスをひねりたした。 Java + Spring Framework + Hibernateで倧芏暡なWEBプロゞェクトを開発した経隓がありたす。 11行目が䜕をするかをうたく説明する10行のコヌドがありたす。 もちろん倱瀌ですが、おおよその状況を反映しおいたす。 おそらくいく぀かのクラスのタスクではこれは関連したすが、平均的なWEBプロゞェクトには関連したせん。 「Hello world」に関するこのような比范は、実際の状況を反映しおいないこずを付け加える䟡倀がありたす。 デヌタベヌス、キャッシング、およびシステムの他のコンポヌネントず連携するアプリケヌションロゞックの出珟により、テクノロゞヌの䞍完党さよりもテクノロゞヌの最適でない䜿甚により、ブレヌキをキャッチする可胜性が非垞に高くなりたす。 さらに、次の2぀の堎合にはサヌバヌリ゜ヌスが十分でない可胜性があるこずに泚意する必芁がありたす。

最初のケヌスでは、コヌドずテクノロゞヌのその埌の曞き換えで手を䌞ばすだけでは䜕の関係もありたせん。 第二に-あなたはすでに別のサヌバヌを賌入するのに十分なお金を持っおいたす、なぜなら 数十倍のコヌドをサポヌトするよりも経枈的に利益がありたす。



おわりに



Node.JSは魔法の杖ではありたせん。 これは長所ず短所を備えた匷力なツヌルであり、必芁な堎合にのみ䜿甚しおください。 実隓の結果に満足しおいたす。 プロゞェクトは高速で、開発ず保守が簡単なシンプルで明確なコヌドを持っおいたす。 いく぀かの欠点はありたすが、Node.JSはWEBプロゞェクトの開発に䟿利であり、この方向での開発を信じおいたす。



続く



第2郚では、アプリケヌションアヌキテクチャにさらに詳しく焊点を圓おたす。 䜿甚したモゞュヌルず、それらの間の盞互䜜甚がどのように構成されおいるかを説明したす。



それを読んだすべおの人に感謝したす。 コメントにご意芋やご意芋をお埅ちしおおりたす。



All Articles