SlideShare a Scribd company logo
1 of 13
Download to read offline
Node.js + MongoDB
シングルページ Webアプリケーション(SPA)
Aug 2015, Naoki Sasaki
Webの歴史
• 静的HTMLドキュメントの表示とハイパーリンクによるHTMLドキュメン
ト間のリンク
• HTMLドキュメント内の一部を動的に置き換える(サーバサイド・インク
ルードなど)
• JSP/ASP/PHPなど、HTMLドキュメント内にスクリプトを埋め込み、サー
バサイドで実行した結果の HTMLドキュメントをクライアントへ返す
• クライアントから Ajaxにより Servlet/EJBなどへリクエストを発行し動的
にクライアント上の HTML DOMを書き換える(レスポンシブル Webアプ
リケーション)
これまでのWeb
• クライアントからの要求に従って HTMLドキュメント
をなるべく高速に返すという設計で成り立っている
• そのため、Apacheなどの Webサーバはクライアント
リクエストを待ち構えるスレッドを数十∼数百個事前
に作成(スレッド・プール)し、そのスレッドがリク
エストされた HTMLドキュメントを生成しクライアン
トへ返し、接続を切った後にスレッドプールへ返す方
法を取っている
これからのWeb
• クライアントがサーバへHTMLドキュメントを要求するの
は最初のごく小さなHTMLドキュメントで、以降サーバへ
HTMLドキュメントの再読込は一切行わない
• クライアントとサーバ間では WebSocketによりリクエス
ト/レスポンスを行い HTML DOM構造を動的に変更し続け
る(シングルページWebアプリケーション)
• そのため、クライアント/サーバ間は WebSocket通信の
ために常時接続が保たれる
従来のWebサーバの問題
• スレッド・プーリング方式の Webサーバでは一
度に数百のリクエストを高速に応えることはで
きるが、WebSocketを使用し、常時接続状態が
要求されるシングルページWebアプリケーショ
ンの場合には数百のプーリングされた待ち受け
スレッドをすぐに使い果たしてしまう
Node.jsの登場
• Node.jsはクライアントリクエストをイベント・ドリブンで処理する(ス
レッド・プールという概念はない)
• クライアントから要求があるとイベント・ハンドラへ要求を渡し、待ち受け
ハンドラは次のクライアント・リクエストを待つ
• イベント・ハンドラはクライアントとの接続が切れるまで存在する
• そのため、WebSocketによってクライアント/サーバ間で常時接続状態に
なっている場合でもスレッド・プーリング方式のように数百コネクション、
またはそれ以上となっても問題が発生しない
• 一般的なエントリレベルサーバ(Xeon 3GHz 4-Core、16GB)で同時数十万
接続が可能とされている
Node.jsのパフォーマンス
Node.jsのスケーラビリティ
• 1 Node.jsサーバでパフォーマンスが低下するほ
どの同時接続数が見込める場合には、Node.jsを
クラスタリングすることができる
• 一般的なロード・バランサやリバース・プロキ
シ(NGInxなど)
• Cluster.jsなどの実装
Databaseのおさらい
• データベースの種類
• ISAM DB
• テーブルへキーおよびデータ情報を持ち、キーによるデータベースアクセスを行う
• データベースを構造的に表現するのはプログラムロジックによって行われる
• RDBMS(SQL)
• テーブル・スペース内のテーブルへ行・列でデータがストアされる
• データベースを構造的に表現するためにはSQL(SELECT)文によるクエリが必要
• XML(オブジェクト) DB
• テーブル・スペース、テーブル、行、列という概念はなく、XML形式のオブジェクトを格納するオブジェク
ト指向データベース
• データベース内のオブジェクトがデータの構造そのものを表している
• 特定のデータへは XPath記法によるクエリーが可能
MongoDB
• MongoDBとは XML Databaseの入出力を JSON形式に置き
換えたものである
• XML DB同様に JSON形式で表現されたオブジェクト・
データをデータベースへ格納する
• オブジェクト・データのクエリには XPath同様の機能を備
えたjQuery様の“$(#foo)”といった記法で記述する
• RDBMSで言うストアド・プロシージャとして JavaScript
が使用可能
MongoDB
• データベース内にはどのような構造のオブジェク
トであっても格納できるが、これは諸刃の剣で
あるため、XMLでの DTD(Data Definition
Descriptor)と同様にオブジェクト構造を厳格に
定義するための機能として JSV(JSON
Validation)がある。これによって一貫したオブ
ジェクトのみデータベースへストアできる
MongoDBのスケーラビリティ
• MongoDBの組み込み機能により、複数マシン間
のレプリケーションが可能
• サーバをダウンさせることなくレプリケーショ
ンサーバを作成し、負荷分散を行わせることが
可能
まとめ
• Node.js+MongoDBを組み合わせることにより、フロントエンドの Webク
ライアント、アプリケーション・サーバ、データベースまで同一言語
(JavaScript)で記述できる
• そのためビジネス・ロジックの見直しが必要になった場合など、クライ
アントで行っていた処理をAPサーバ(Node.js)へ移行する、MongoDB
のストアド・プロシージャへ移行するなどと言ったことが簡単に行える
• ユーザの状態を永続化する場合などには単に JavaScriptオブジェクトを
シリアライズし MongoDBへストアするのみでOK
• (これは JavaScriptが Classベースのオブジェクト指向言語ではな
く、Prototypeベースのオブジェクト指向言語であるため)

More Related Content

Similar to Node.js+MongoDB in SPA

HTTP 2.0のヘッダ圧縮(HPACK)
HTTP 2.0のヘッダ圧縮(HPACK)HTTP 2.0のヘッダ圧縮(HPACK)
HTTP 2.0のヘッダ圧縮(HPACK)
Jun Fujisawa
 
ゆるべん Webアプリ開発概要 20130127
ゆるべん Webアプリ開発概要 20130127ゆるべん Webアプリ開発概要 20130127
ゆるべん Webアプリ開発概要 20130127
Y
 

Similar to Node.js+MongoDB in SPA (20)

Mvc conf session_3_takehara
Mvc conf session_3_takeharaMvc conf session_3_takehara
Mvc conf session_3_takehara
 
React.js + Reduxで作るSPA
React.js + Reduxで作るSPAReact.js + Reduxで作るSPA
React.js + Reduxで作るSPA
 
20100313
2010031320100313
20100313
 
JavaScriptでSQLを唱えたいだけの人生だった
JavaScriptでSQLを唱えたいだけの人生だったJavaScriptでSQLを唱えたいだけの人生だった
JavaScriptでSQLを唱えたいだけの人生だった
 
SilverlightとSharePoint2010の紹介
SilverlightとSharePoint2010の紹介SilverlightとSharePoint2010の紹介
SilverlightとSharePoint2010の紹介
 
勉強会資料①
勉強会資料①勉強会資料①
勉強会資料①
 
簡単なHTTPサーバの作成
簡単なHTTPサーバの作成簡単なHTTPサーバの作成
簡単なHTTPサーバの作成
 
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
[要約] Building a Real-Time Bidding Platform on AWS #AWSAdTechJP
 
私たちは何を Web っぽいと感じているのか
私たちは何を Web っぽいと感じているのか 私たちは何を Web っぽいと感じているのか
私たちは何を Web っぽいと感じているのか
 
HTTP 2.0のヘッダ圧縮(HPACK)
HTTP 2.0のヘッダ圧縮(HPACK)HTTP 2.0のヘッダ圧縮(HPACK)
HTTP 2.0のヘッダ圧縮(HPACK)
 
About http
About httpAbout http
About http
 
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしいIBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
 
Rest ful api設計入門
Rest ful api設計入門Rest ful api設計入門
Rest ful api設計入門
 
Mvc conf session_1_osada
Mvc conf session_1_osadaMvc conf session_1_osada
Mvc conf session_1_osada
 
Concentrated HTML5 & Attractive HTML5
Concentrated HTML5 & Attractive HTML5Concentrated HTML5 & Attractive HTML5
Concentrated HTML5 & Attractive HTML5
 
プロジェクト2B 最終発表
プロジェクト2B 最終発表プロジェクト2B 最終発表
プロジェクト2B 最終発表
 
ゆるべん Webアプリ開発概要 20130127
ゆるべん Webアプリ開発概要 20130127ゆるべん Webアプリ開発概要 20130127
ゆるべん Webアプリ開発概要 20130127
 
Rendr入門: サーバサイドで(も)動かす、Backbone.js
Rendr入門: サーバサイドで(も)動かす、Backbone.jsRendr入門: サーバサイドで(も)動かす、Backbone.js
Rendr入門: サーバサイドで(も)動かす、Backbone.js
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
 
Real timeweb
Real timewebReal timeweb
Real timeweb
 

Node.js+MongoDB in SPA