それはほが2018幎の倖であり、コヌルバックが倧奜きです

最初の時点でアむデアが䞍合理に思えない堎合、それは絶望的です。

-アルバヌトアむンシュタむン

HabréでのNode.jsディスカッションから最も人気のあるトピックを収集し、有名な専門家にそれらに぀いお話すように䟝頌したした。非営利のNode-hacker Matias MadsenずNodeの倚くの本ずコヌスの著者、Azat Mardanです。







トピックの正確なリストは次のずおりです。







  1. Node.jsのストリヌムず蚈算を䞊列化するメ゜ッド。
  2. Node.jsの非同期;
  3. Node.jsでのデバッグずロギング。
  4. 実皌働パフォヌマンスの監芖の問題。
  5. ノヌドを監芖するためのツヌル。







    Azat Mardanは、 Technology Fellow、 Capital Oneのマネヌゞャヌであり、JavaScript / Node.jsの専門家であり、 Udemy and Node Universityでいく぀かのオンラむンコヌスを持ち 、 React Quicklyを含む同じテヌマに関する14冊の著者です。 」2017幎マニング、「 JavaScriptのフルスタック 」2015幎Apress、「 実甚的なNode.js 」2014幎のApress、および2014幎の「 Pro Express.js 」。



















空き時間には、 AzatはWebapplog.comでテクノロゞヌに぀いお曞き、䌚議で講挔し 、オヌプン゜ヌスに貢献しおいたす。 Node.jsの゚キスパヌトになる前に、Azatは情報システムの修士号を取埗しお卒業し、米囜連邊政府機関、小芏暡な新興䌁業、およびJava、SQL、PHP、Rubyなどのさたざたなテクノロゞヌを備えた倧䌁業で働いおいたした。







Azatは、テクノロゞヌず金融、そしお人々を教育し、力を䞎えるための新しい玠晎らしい方法に情熱を泚いでいたす。








Mathias Buus Madsenは、デンマヌクのコペンハヌゲンに拠点を眮く非営利のハッカヌNode.jsです。 オヌプン゜ヌスでフルタむムで動䜜し、Datプロゞェクト http://dat-data.com 科孊者がデヌタセットを共有できるようにするオヌプンツヌルを䜜成したす。 珟圚、npmで400を超えるモゞュヌルをサポヌトしおいたすが、それ自䜓が印象的です。


HolyJS 2017モスクワ䌚議でラむブで䌚えるこずを思い出しおください。







ステヌゞ䞊のサヌバヌサむドJavaScriptが長い間登堎しおいたため、プログラミングコミュニティはそれを受け入れた人ずそれ以倖の人に分かれおいたした...あなたず私は、特にサむトがPHPでよく曞かれおいるずいう考えなど、䜕か明らかになるず、ホリバヌに慣れおいたせんうヌん...、たたはPerlで、たたはPythonで..しかし、Node.jsに぀いおの投皿は重芁ではありたせん、䜕を曞くべきかを議論するこずは非垞に興味深いですが、これからどのように、唯䞀の適切な蚀語/スタックたずもな結果を埗る。 さらに、Nodeは開発䞭、コミュニティは拡倧䞭、バヌゞョンは登堎䞭、サヌバヌ゚ンゞンは改善し぀぀あり、明るい明日昚日は灰色の背景が近づいおいたす 専門家の蚀うこずを芋おみたしょう...







アザット



2017幎末の状況に぀いおの質問にお答えしたす。これは、ノヌド8、npm 5などを意味したす。今日は、ノヌドの初期に比べお䜕かが倉わりたしたが、倚少は倉わっおいたせん。







1. Node.jsのスレッドず蚈算を䞊列化するためのメ゜ッド



倚くの人が知っおいるように、Nodeはシングルスレッドです。 これはNodeの長所ず短所の䞡方です。 システムがより倚くのI / Oを実行できる非同期ノンブロッキングコヌドの実装が簡単であるため、匷力です。これは通垞、より倚くのトラフィックを凊理するこずを意味したす。 ブロックされるコヌドを曞くこずができるずいう事実のために匱い。 耇数のスレッドを開始するず圹立ちたす。 コア蚀語にはクラスタヌモゞュヌルがありたすが、ほずんどのNode開発者はpm2



䜿甚しpm2



。 開発 pm2-dev



およびコンテナ pm2-docker



をサポヌトしたす。 pm2を開始するには、npmを䜿甚しおむンストヌルし、バックグラりンドで実行したす。







 npm i -g pm2 pm2 start server.js -i 0
      
      





pm2



がすべおの芁件に適合せず、さらに䜎いレベルで䜜業する必芁がある堎合は、 cluster



を䜿甚できcluster



。 Nodeの新しいバヌゞョン珟圚のバヌゞョン8では、 pm2



ように負荷分散が行われおいpm2



。 その結果、耇数のプロセスが同じポヌトでリッスンできるようになり、盞互に、たたメむンプロセスず察話できるようになりたす。 cluster



fork()



を䜿甚する必芁がありcluster



。 これが良い䟋です







 const cluster = require('cluster') const numCPUs = require('os').cpus().length if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork() } } else if (cluster.isWorker) { // your server code })
      
      





最埌に、 fork()



に加えおプロセスを手動で䜜成する方法が2぀ありspawn()



ずexec()



です。 1぀目は、長時間のプロセス、ストリヌミング、倧量のデヌタ甚であり、2぀目は小さなデヌタ出力に適しおいたす。







2. Node.jsでの非同期プログラミング



はい、ノヌドには非同期/埅機機胜がありたす。 私はただコヌルバックが奜きですが、非同期関数は玠晎らしいです。 初心者でも簡単に理解できたす。 非同期関数コヌドは、promiseコヌドよりも短いです。 2぀の非同期のネストされたデヌタベヌス呌び出しを䜿甚したこのMochaテストをご芧ください。 圌は背が䜎くおきれいです。







 describe('#find()', () => { it('responds with matching records', async () => { const users = await db.users.find({ type: 'User' }) expect(users).to.have.length(3) for (let user of users) { const comments = await db.comments.find({ user: user.id }) expect(comments).to.be.ok } }) })
      
      





ずころで、矢印付きの構文だけでなく、構文function() {}



䜿甚できたす。







 const async function() { const {response: res} = await axios. get('https://webapplog.com/api/cupcakes') }
      
      





非同期機胜のもう1぀のボヌナスは、promiseずの互換性があるこずです。 はい、そうです。 これらを䞀緒に䜿甚しお、たずえば、非同期関数を䜜成しおからthenを䜿甚するか、promiseたずえば、私の䟋のutil.promisify()



基づくラむブラリ、たたはutil.promisify()



新しいNode 8メ゜ッドによっお䜜成された関数を䜿甚できたす。







3. Node.jsでのデバッグ



Nodeのデバッガヌは、以前のものに比べお倧幅に改善されたした。 Storifyで働いおいたずきのこずを芚えおいたす䌚瀟は最初のNodeナヌザヌの1人です。コヌド党䜓にconsole.log



を投皿したした。 珟圚、VS Codeでデバッグできたす。 これは玠晎らしい゚ディタヌです。 毎日䜿っおいたす。







次に、 Node Inspectorがありたす。これは、本質的にNode.jsプログラム甚のChrome DevToolsです。 Node v8はNodeに統合されたGoogle Chrome V8 Inspectorを導入したした。GUIデバッガヌを䜿い始めるために必芁なこずは、以䞋を曞くこずだけです







 node --inspect index.js
      
      





次に§chrome://inspect/#devices



をChromeブラりザで開きたす。 バヌゞョン7では、URLをコピヌしおChromeブラりザヌで開く必芁がありたす。 URLの先頭にchrome-devtools://



行が含たれたす。 Nodeスクリプトは、DevToolsからのデバッガヌがプログラムに接続するのに十分な時間動䜜する必芁があるこずを忘れないでください。そうしないず、デバッガヌたたはコヌドにブレヌクポむントを蚭定する必芁がありたす。







NodeはChrome V8䞊に構築されおおり、デバッグにChrome DevToolsを䜿甚したす。これは、優れたGUIを備えおいるだけでなく、将来の信頌できる機胜を確保するためでもありたす。







4. Node.jsのパフォヌマンスの問題



ほずんどのノヌド補造の問題は、メモリリヌク、ネットワヌク、たたはI / Oの問題です。 ストレステストは、実際の負荷条件䞋でアプリケヌションずシステムがどのように機胜するかを理解するのに圹立ちたす。 良いツヌルは倧砲です。 䞀郚のメモリリヌクの問題は、コヌドをわずかに倉曎し、Turbofanず呌ばれる新しいJIT JavaScriptコンパむラに付属するNodeの最新バヌゞョンを䜿甚するこずで解決たたは軜枛できたす。 この優れたGET READY投皿を読んでください最適化に関する新しいV8の登堎、NODE.JSのパフォヌマンスの倉曎 、回避たたは採甚すべきテクニックずコヌド。







5.優れたNode.js監芖ツヌル



開始するには、Nodeコヌドを準備する必芁がありたす。 2018幎には、これはコンテナ、クラりド、および自動化メ゜ッドの䜿甚を意味したす。 詳现に぀いおは、実皌働コヌスのノヌドをご芧ください。







ノヌドは、垂盎方向ポむント1を参照ず氎平方向の䞡方にスケヌリングする必芁がありたす。 もちろん、これはログの監芖ず収集を困難にしたす。 メトリックずログを収集する必芁がありたす。







簡単なダッシュボヌドを自分で䜜成するず、個々のノヌドサヌバヌおよびプロセスを圢成する統蚈ずメトリックが衚瀺されたす...たたは、Capital Oneで䜜成されたHygieiaなどのオヌプン゜ヌスダッシュボヌドを䜿甚したす 念のためCapital Oneで䜜業しおいたす。







優れたロギングツヌルはりィンストンずバンダンです。 Loggly、Splunk、Papertailなど、サヌドパヌティのSaaSなど、任意の堎所にログを送信できたすStorifyで䜿甚したした。 すべおのデヌタを所有しおおきたい堎合は、KibanaでElastic Searchをデプロむし、そこにログを送信したす。 これは、セキュリティずプラむバシヌの理由でサヌドパヌティのサヌビスを䜿甚できなかったずきにDocuSignで行ったこずずたったく同じです。 Winston、Elastic、Kibanaをベヌスにした独自の゜リュヌションを開発したした。







特に本番環境でのモニタリング甚に考慮すべきいく぀かのツヌルずサヌビスすべおが無料ではありたせんこれらはN | Solid 、 NewRelicおよびAWS CloudWatchです。







完了



Nodeは異垞なペヌスで成長しおいたす。 新しいバヌゞョンがなくおも、これはすでに驚くべき技術です。 高速で信頌性が高く、最も重芁なこずは、開発者に気楜なコヌディングの喜びをもたらしたす。 Nodeスタックに移動するず、倚くの幞せなJavaおよびC開発者が芋぀かりたした。







マティアス



いく぀かのこずを䞊行しお行いたす



Node.jsは蚭蚈䞊シングルスレッドです。 これは実際には䟿利な機胜です。これは、プログラムがい぀でも䞭断される可胜性のあるJavaのような蚀語よりも、メモリから競合状態などを簡単に凊理できるこずを意味するためです。







すべおの入力/出力操䜜が非同期に実行されるため、プログラム自䜓の実行をブロックしないため、それ自䜓をシングルスレッドにするこずができたす。 さらに、NodeのJavaScriptにはプログラムの実行スレッドが1぀ありたすが、それ自䜓がさらにいく぀かのスレッドを䜿甚しお、バックグラりンドI / Oタスクやその他のナヌティリティタスクの支揎に察凊したす。







このアプロヌチには1぀の欠点しかありたせん。 堎合によっおは、プロセッサの凊理胜力のみを消費するコヌドを実行する必芁がありたす。 この時点ではI / Oは実行されないため、Node.jsプログラムはこのコヌドが完了するたでブロックされたす。 プロセッサを集䞭的に䜿甚する操䜜暗号化などに぀いお話しおいる堎合、操䜜が完了するたでNodeプログラムは䜕も実行できないため、これはマむナスの圱響を䞎える可胜性がありたす-これを避けるこずができたす。







これを実珟するにはいく぀かの方法がありたす。 これらのアプロヌチの1぀私がよく䜿甚したすは、ネむティブモゞュヌルを䜜成し原則ずしお、すべおのプロセッサを集䞭的に䜿甚する操䜜には䟝然ずしお䜕らかのネむティブモゞュヌルの䜿甚が必芁です、本圓に玠晎らしいワヌカヌAPIを䜿甚したす。 このAPIを䜿甚するず、過去-同期操䜜でコヌルバックを䜿甚したりプロミスを返したりでき、C ++ずWorker APIを䜿甚しお䜜成したタスクは別のシステム実行スレッドで動䜜したす。







別のアプロヌチは、プログラムを小さな郚分に分割し、耇数のプロセスずしお同時に実行するこずです。 基本的に、これはプログラムを小さな分散システムに再蚭蚈するこずを意味したす。 このようにしお、倚くのプロセッサコアを完党にネむティブな方法で䜿甚できたす。







いずれにしおも、プログラムのNodeコヌドの䞊列実行の実装を開始するず、はるかに倚くの非同期コヌドが埗られたす。 Nodeで非同期コヌドを管理するこずは、最初は非垞に困難に思えたすが、経隓が増えるに぀れお理解しやすくなりたす。 Nodeの珟圚のバヌゞョンでは、async / awaitなどの機胜を䜿甚しお、promiseも䜿甚する堎合、非同期コヌドを同期的に芋せるこずができたす。 これに起因する耇雑さの1぀は、try-catch構文の䜿甚を䜙儀なくされおいるため、次のような構文を理解する必芁があるこずです。 JavaScriptのtry-catchは、他の蚀語ではコンパむル゚ラヌたずえば、コヌドのタむプミスなどに぀ながる状況もむンタヌセプトするため、より深刻なバグが発生したす。 ぀たり、゚ラヌ凊理コヌドでプログラムの実行䞭に構文゚ラヌず゚ラヌに関するメッセヌゞを受け取るため、バグの怜玢はより耇雑になりたす。







その結果、私はほずんどの堎合、非同期プログラミングにコヌルバックを䜿甚したす。たた、 after-allモゞュヌルなどの倚数の補助ラむブラリず組み合わせたす。







デバッグず監芖



私が気に入っおいるNodeの機胜の1぀は、アプリケヌションの動䜜をデバッグおよび監芖するのに圹立぀優れたツヌルの数ですそしお、倚くのツヌルを自分で䜜成したした。 Nodeを䜿甚する堎合、V8で実行されるJavaScriptコヌドを䜿甚したす。 たた、V8には豊富なAPI機胜があり、V8から優れたパフォヌマンスを匕き出すこずができたす。 これにより、䞍必芁な掚枬を行うこずなく、アプリケヌションの問題の本圓の原因「ボトルネック」を远跡できたす。

特にDavid Mark Clementず圌の友人によっお曞かれた0xモゞュヌル https://github.com/davidmarkclements/0x が倧奜きです。 このモゞュヌルは、ベンチマヌクを実際のフレヌムグラフに簡単に倉換したす。 ノヌドの代わりに0xでベンチマヌクを実行したすさらに、フレヌムグラフを䜜成しおから、ブラりザで開きたす。







 0x -o my-benchmark.js
      
      





このグラフは、どのJavaScript関数がプログラムの実行により倚くのプロセッサヌ時間を䜿甚するかを明確に瀺したす。 このアプロヌチは、最適化で最も泚意を払うべきものの芖芚的なアむデアを提䟛したす。







opsタスクによく䜿甚する別のモゞュヌルは、 respawnず呌ばれる独自のモゞュヌルです。 プロセスを開始し、プロセスがクラッシュした堎合に再起動するのに圹立ちたす。







再スポヌンするために 、 lil-pidsず呌ばれるかわいいcli-wrapperがありたす。 lil-pidsにはむンタヌフェヌスがなく、。/ servicesずいう名前のファむルのみが必芁です。システムで実行したいすべおのコマンドを指定するだけで、lil-pidsはそれらを芋お、respawnモゞュヌルで達成しようずしたす。すべおが実行されるようにしたす。







最埌に、実皌働環境でコヌドを䜿甚する際にNodeで解決しなければならない別の問題は、ランダムメモリリヌクです。 JavaScriptには独自のガベヌゞコレクタヌがありたすが、倚くの堎合、リストにアむテムを远加したり、そこからアむテムを削陀するのを忘れたりするなどしお、メモリリヌクを蚱可したす。 メモリリヌクを蚱可しないこずもありたすが、非垞に倚くのメモリを消費するアルゎリズムを実装するため、ある時点でシステムがプログラムプログラムを匷制的に停止したす。 メモリリヌクがあるかどうかを刀断するために、私はよくmemory-usageず呌ばれるThomas Watsonモゞュヌルを䜿甚したす 。 圌が行う唯䞀のこずは、プログラムが時間ずずもに䜿甚するメモリ量に関するデヌタの無限のストリヌムを提䟛するこずです。 この倀のグラフを描くず、メモリリヌクがい぀始たるかがわかりたす。







有名なこずわざに関係なく、「䞀床芋る」よりも良い遞択肢がありたす-私たちのケヌスでは、「レポヌトを芋お聞いおから質問をし、傍芳しお話したす」。 HolyJS 2017モスクワ䌚議にご招埅したす








All Articles