Node.jsのメリットとデメリット




どうも高妻です。Twitterでプログラミングのことや暗号通貨のことをつぶやいているのでよかったらフォローしてください。  

Node.jsの特徴

まずは言語の特徴を紹介します。

  • Node.jsはJavascriptでサーバーサイドアプリケーションを実装することができます。
  • シングルスレッドで動作します。
  • イベントループとノンブロッキングI/O
  • 言語自身がWEBサーバーの役割を持っているためApacheやNginxなどのWEBサーバーを必要としません。
  • 使い始めるまでのセットアップがものすごく少なくすぐに使い始められます。

ざっとこんな感じでしょうか?言語がJavascriptなので親近感が湧く人が多いかと思います。まあ、ビジネスレベルでの普及度は日本だとまだまだな感じはありますが。

ちなみに自分はスマホゲームのバックエンドを全てNode.jsで作ってました。4年間Node.jsばっかりやってたのでまあまあ詳しい方かと思います。

メリット

まずはNode.jsのいいところからですね。

C10K問題がない

WEBサーバーに接続するクライアント数が1万接続を超えると増えすぎたスレッドがメモリを食い潰してしまうという問題です。メモリだけ食い潰してCPUを全然使えない勿体無い状況が生まれます。

Javaなどのマルチスレッドのプログラミング言語はこの問題に対してサーバーを増強して解決します。

Node.jsはシングルスレッドで動作するのでどんなに接続数が増えてもスレッドがメモリを食い潰すことがことがありません。この問題を根本解決できるという点でもNode.jsは注目されました。

ノンブロッキングI/O

スレッドは同時に一つの処理しかできません。Javaではデータベースへの読み書き時に処理が完了するまで待ちが発生しますが、Node.jsは待ちが発生しません。これをノンブロッキングI/Oと言います。

Node.jsはデータベースへの読み書きが完了したタイミングを取得できます。この処理が完了したタイミングでコールバック関数が呼ばれる仕組みをイベントループと呼びます。

Node.jsはこの仕組みを使ってノンブロッキングI/Oを実現しています。

イベントループを使ったノンブロッキング I/Oの仕組みが素晴らしいですね。この仕組みがC10K問題を解決しているんですね。

開発が活発

Node.js自体の開発も活発ですし、Node.jsで使うフレームワークやライブラリの開発も非常に活発です。

Node.jsのライブラリはnpm(Node Package Manager)と言うものが使われています。2017年11月時点で475,000件ものライブラリが登録されています。

npmのライブラリは本当に便利なものが多くそれらを組み合わせることでアプリケーションを楽に実装することができます。

リアルタイム通信を楽に実現できる

npmにはSocket.IOというリアルタイム通信を楽に導入できるライブラリがあります。そのおかげかNode.jsはチャットサービスやリアルタイム通信を必要とするゲームで使われることが多いです。

Socket.IOも日々進化しておりどんどん使いやすくなっています。もしリアルタイムなサービスを作りたいときはNode.jsのSocket.IOを検討することをオススメします。

Socket.IOを使いやすくしたテンプレ的なものをOSSとして公開しているので下記記事も参考にしてみてください。

関連記事:Socket.IOでリアルタイム通信を行うOSSを作りました

デメリット

Node.js単体ではすでにそんなにでデメリットはないと思います。他の言語と比較して弱いところを書きます。

デプロイが難しい

Node.jsはホットデプロイの機能がありません。なので、新しいソースコードをデプロイする場合は再起動を行うか新しくプロセスを立ち上げないといけません。

再起動を行うと処理中のリクエストを殺してしまうのでこれは絶対にできません。利用者数が少なくそんなに問題としないなら大丈夫ですが、大くの人が使うサービスだと影響が出てしまいます。

となると、新しくプロセスを立ち上げないといけないのですが、これは少し工夫が必要になります。

その工夫をグレースフルリスタートと言うのですが詳細は下記リンクに記載しているのでぜひ参考にしてみてください。

関連記事:Node.jsサーバーへの正しいデプロイ方法

動的型付け言語

静的型付け言語に慣れている人にはなかなか扱いづらいかもしれません。そのせいか、TypeScriptやFacebookが開発しているFlowと言う静的型付けでJavascriptを実装できるものが流行ったりしています。

これは好き嫌いやトレードオフの関係があるので単純にデメリットとは言えないことを付け加えておきます。

人材が少ない

これは言語的な問題ではなく市場の問題です。日本ではNode.jsエンジニアを採用するのが非常に難しいです。これは自分の経験談なのではっきり言えます。

Node.jsを実運用で経験してましたという人は市場にほぼいないですね。趣味程度で触っていたと言う人は多いですが即戦力はいないです。もしこれから大規模開発をNode.jsで行う場合はそこを気をつけたほうがいいでしょう。

自分の開発チームはサーバーが3人もいれば良かったのでそこまでこの問題は引きずりませんでした。

合わせて読みたい







コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です