MEANスタックとは
MongoDB,Express,AngularJS,Node.jsのソフトウェアバンドルのことである。Webアプリケーション開発に用いられる。このソフトウェアの組み合わせは、MongoDB開発者のValeri Karpovniにより、2013年4月30日にWeb上で提唱され、2014年以降より徐々に有名になってきた。
MEANスタックの提唱が行われた、Valeri Karpovniによるブログエントリ
MEANスタックの本来の思想を確認する事が出来ます。
The MEAN Stack: MongoDB, ExpressJS, AngularJS and Node.js
特長
インターネット上で広く流布している説によれば、サーバサイドからクライアントサイドまでの開発言語がJavaScriptに一本化でき、Perl,PHP,Python,Ruby等のCGI言語を採用した場合と比較して学習コストが大幅に削減できる点が最大の特長であるとされている。しかし、実際にはサーバサイドJavaScriptとクライアントサイドJavaScriptではプログラミングパラダイムとAPI体系が大きく異なっているため、開発言語のJavaScriptへの統一自体は学習コストの低減にはあまり寄与していないと推測できる。
実際的には、LAMPスタックやRails等と比較して、下記の特長を持つと考えられる。
従来難しかった、1つのスレッドに複数のコネクション処理を多重化する、シングルスレッドかつノンブロッキングなイベント駆動I/Oの容易なプログラミングが可能になる。従って、1コネクションに対し1スレッドを割り当てることを前提とした、従来型のHTTPサーバソフトウェアと比較して、処理効率を容易かつ飛躍的に高くできる。
クライアントサイドからサーバサイドのデータベースまで、やり取りするデータがJSON形式に一本化でき、データ形式の変換が無くなる。
MEANスタックにおける個々のソフトウェアの役割
MongoDB
ドキュメント指向のNoSQLデータベース
概要
JSON形式のデータをそのまま格納できるため、SQLデータベースと比較して、入出力時におけるデータ形式の変換がなく、オーバーヘッドも少なくなる。
入手方法
各OS向けに用意されたパッケージ管理システムから最新版がインストールできる。
Express
サーバサイドMVCフレームワーク
入手方法
Node.js上の追加パッケージとして提供される。
AngularJS
クライアントサイドMVWフレームワーク
概要
自身が採用するモデルをModel-View-Whatever(MVW)モデルとしており、MVC,MVVM等の様々なモデルを利用可能としている。
入手方法
クライアントサイドJavaScriptライブラリとして提供される。
Node.js
Google V8 JavaScript Engineに基づいた、イベント駆動I/Oを実現するサーバサイドJavaScript実行環境
概要
主にHTTPサーバの役割を果たす。C10K問題(10000個のコネクションが、同時に1台かつ1CPUのサーバに対して張られた際のサービス破綻の問題)を解決する手法である、シングルスレッドかつノンブロッキングなイベント駆動I/OをJavaScriptで容易にプログラムできるようにした事で話題になっている。Apache,Nginx等の、1コネクションに対して1スレッドを割り当てるマルチスレッド型のHTTPサーバソフトウェアよりも、圧倒的に省メモリかつ高速に動作する。
Node.jsの動作原理である、シングルスレッドかつノンブロッキングなイベント駆動I/Oでは、1つのコネクションのデータ入出力の待ち時間に、同じスレッドで別のコネクションの処理を開始することが出来る。従って、I/Oバウンドな処理に向いている。これは、HTTPサーバで一般的に行われる処理の内容と非常にマッチし、HTTPサーバの処理効率の向上に大きく寄与している。
従って、科学技術計算に代表されるようなCPUバウンドな処理をNode.jsのイベントループ内で多用することは、コネクションを全く捌けなくなる可能性が高まるため、あまり好ましくないと言える。
シングルスレッドかつノンブロッキングなイベント駆動型I/Oの特性上、1つのコアに対して1つのイベントループを割り当てて運用するべきである。
C10K問題に関する、数少ない解決策の1つである。
入手方法
各OS向けに用意されたパッケージ管理システムの他、公式サイトのバイナリパッケージ,ソースコードパッケージからもインストールできる。公式サイトでは常に安定版と最新版の両方を提供している。
YEOMANとは
下記のワークフローを一括して行えるようにするツールである。YEOMANの下位ではBowerとGruntが動作している。
YEOMANが扱うワークフロー
- クライアントサイドJavaScriptライブラリのインストールと依存関係管理
- WebアプリケーションのScaffolding
- Webアプリケーションの起動
- WebブラウザによるWebアプリケーションのプレビュー
実際の開発環境構築作業
世界で最も広く普及しているLinuxディストリビューションであるUbuntuを前提として、開発環境構築作業を進める。
WebアプリケーションのScaffold生成に必要なソフトウェア群のインストール
MEANスタックやYEOMANとYEOMANが依存するツール等、WebアプリケーションのScaffold生成に必要なソフトウェア群をインストールする。
MondoDB,Ruby,Compassのインストール
MongoDBと、Grunt用にRubyとCompassをインストールする。
sudo apt install mongodb ruby ruby-compass
sudo gem install compass
Node.jsのインストール
公式サイトからダウンロードできるソースコードをビルドしてインストールする。
パッケージのルートディレクトリに移動
sudo ./configure
sudo make
sudo make test
sudo make install
Node.js上の追加パッケージのインストール
sudo npm install generator-webapp generator-angular-fullstack generator-karma grunt-karma jit-grunt karma-phantomjs-launcher karma-jasmine gulp-cli bower express yo --save-dev
YEOMANを用いたScaffold生成&動作確認作業
次に、WebアプリケーションのScaffoldを生成する。
WebアプリケーションのScaffolding
sudo yo
キーボード操作で Angular Fullstack を選択し、エンターキーを押して処理を進める。
Webアプリケーションの起動とWebブラウザによるプレビュー
gulp serve
自動的にWebブラウザが起動し、Webアプリケーションが操作可能になる。
Node.jsの次世代: Vert.x
2009年に提供され始めたNode.jsに影響を受け、2012年にVert.xが提供され始めている。Vert.xはNode.jsと比較しても動作効率が高いと言うベンチマーク結果が出ている。