はじめに
初投稿です。
普段はJavaを使用して、Webアプリケーションの開発に携わっています。(2年ほど)
趣味で自宅でプログラミングをしているのですが、最近Javascriptでローカルサーバーが構築できることを知り、うきうき気分でNode.jsをインストールしました。
そこで最初につまづいたのが、このイベントループ処理という方式なので、備忘録的に残しておこうと思います。
※ 当方、まだまだ経験も知識も浅いため、間違っている点等があれば、遠慮なくご指摘ください。
スレッドとイベントループ
今まで自分が使用してきたJava言語と何が違うのか、ざっくり違いを挙げていくと
Javaはスレッドモデルである
Node.jsはイベントループ方式である
- 並列で処理するか、並行で処理するか
- マルチスレッドか、シングルスレッドか
というイメージです。
並列処理と並行処理の違いについては、以下の記事が参考になりました。
https://qiita.com/Kohei909Otsuka/items/26be74de803d195b37bd
スレッドモデルでは、1つのリクエストに対して、1つのスレッドを生成します。
対して、イベントループでは、リクエストが幾つかに関わらず、1つのスレッド上でしか動作しません。
それぞれのメリット・デメリット
スレッドモデル
メリット
並列処理ができるため、複数のリクエストがきた場合、他のリクエストが失敗していても、他のリクエストの処理は邪魔されることなく実行されます。
デメリット
スレッドはメモリを消費するため、メモリに限界がくると次のリクエストが受け付けられなくなります。C10K問題が起こりうる。
イベントループ方式
メリット
C10K問題を回避できる。
デメリット
こちらに参考になる記事がありました。
まだ全体的に読んでも理解できていないので割愛します・・・
https://www.yunabe.jp/docs/why_events_are_a_bad_idea.html
Node.jsを使ってみて感じたこと
普段Javaになれており、非同期処理といえばAjax!ぐらいしか知らないような自分にとっては、実装が難しく感じました。しかし、Javascriptで無意識的に敬遠していた、Promiseやasync/awaitについて嫌でも触れることになったので、とても勉強にもなりました!
補足
今回で学んだasync/awaitやPromiseについても、どこかで備忘録にあげていこうと思います。
また、イベントループ方式はNode.jsでしか使われていないわけではなく、Javascriptに備わっているsetTimeoutなどもイベントループ方式らしいです。
こちらのサイトが動きもついててとてもわかりやすかったです。