- Webは以下の特徴を持つ
- ハイパーメディア
- 世界規模の分散システム
- 上記の成功を収めたのは、Webの設計思想RESTによる
- RESTはWebのアーキテクチャスタイル
- アーキテクチャスタイルとは?
- 別名「マクロアーキテクチャパターン」
- デザインパターンは別名「マイクロアーキテクチャパターン」
- アーキテクチャを設計するときの、指針・作法・流儀
- 別名「マクロアーキテクチャパターン」
- RESTはネットワークシステムのアーキテクチャスタイル
- ex. クライアント/サーバなども
- RESTはクライアント/サーバに制約をつけたもの
- 抽象化レベルの関係
抽象化レベル | Webでの例 |
---|---|
アーキテクチャスタイル | REST |
アーキテクチャ | プラウザ、サーバ、プロキシ、HTTP、URI、HTML |
実装 | Apache、Firefox、IE |
- RESTの原則[1]
- ステートレスなクライアント/サーバプロトコル
- すべての情報(リソース)に適用できる「よく定義された操作」のセット
- リソースを一意に識別する「汎用的な構文」
- アプリケーションの情報と状態遷移の両方を扱うことができる「ハイパーメディアの使用」
- リソース
- Web上に存在する、識別子をもったありとあらゆる情報
- リソースの識別子
- URIのこと
- リソースとURIのまとめ
- リソースとはweb上の情報
- 世界中の無数のリソースは、それぞれURIで一意の名前を持つ
- URIを用いることで、プログラムはリソースが表現する情報にアクセスできる
- リソースのアドレス可能性
- URIなどが備える、リソースをかんたんに指し示せる性質のこと
- RESTは複数のアーキテクチャスタイルを組み合わせて構築した複合アーキテクトスタイル
- クライアント/サーバに他のアーキテクチャによる制約を課すことで説明する
- クライアントがリクエストを送り、それにサーバがレスポンスを返すスタイル(メッセージパッシング)
- 利点
- 管理者に取ってサービス管理が容易
- クライアントをマルチプラットフォームにできる
- 分散処理、冗長化可能
- 機能が分離できる
- UIはクライアントで決めれば良い
- サーバはデータストレージとしての機能さえ持てば良い
- クライアントの計算機資源への負荷減少
- 欠点
- Single Point of Failure
- サーバの計算機資源への負荷集中
- サーバまでのネットワーク資源への負荷集中
- その中でも、RESTは統一IFを追加した「統一/クライアント/キャッシュ/ステートレスサーバ」
- クライアントのアプリケーション状態をサーバで管理しないこと
- 利点
- リクエストに答えたらすぐにサーバの計算機リソースを開放できる
- 欠点
- Cookieなどのセッション管理はステートフル
- ステートレス性を追加したアーキテクチャスタイルを「クライアント/ステートレスサーバ」という
- 一度取得したリソースをクライアント側で使いまわす方式
- 利点
- サーバとクライアント間の通信回数をへらす
- キャッシュを追加したアーキテクチャスタイルを「クライアント/キャッシュ/ステートレスサーバ」という
- 統一IFを導入することで階層化可能
- 利点
- 階層化しやすい
- ex. ロードバランサー、プロキシを入れられる
- 階層化しやすい
- 階層化システムを追加したアーキテクチャスタイルを「統一/階層化/クライアント/キャッシュ/ステートレスサーバ」という
- プログラムコードをサーバからダウンロードし、クライアント側で実行するアーキテクチャスタイル。
- ex. JavaScript、Flash、Javaアプレット
- 利点
- クライアントを後から拡張できる
- 欠点
- ネットワーク通信におけるプロトコルの可視性が低下する
- HTTPでリソースにアクセスする以上のことをしており、よくわからなくなる
- ネットワーク通信におけるプロトコルの可視性が低下する
- コードオンデマンドを追加したアーキテクチャスタイルを「統一/階層化/コードオンデマンド/クライアント/キャッシュ/ステートレスサーバ」という
- クライアント/サーバ:UIと処理を分離する
- ステートレスサーバ:サーバ側でアプリケーション状態を持たない
- キャッシュ:クライアントとサーバの通信回数と量を減らす
- 統一IF:IFを固定する
- 階層化システム:システムを階層に分離する
- コードオンデマンド:プログラムをクライアントにDLして実行する
- 他のアーキテクチャスタイルの例[2]
- メッセージパス
- レイヤ・アーキテクチャ
- SOA
- P2P
- プラグイン
- パブリッシュ/サブスクライブ
- パイプ&フィルタ
- フロントエンド/バックエンド