CDP:State Sharingパターン
提供:AWS-CloudDesignPattern
ステート情報の共有
目次 |
解決したい課題
動的なコンテンツを生成する際、ユーザー固有の状態を持つステート情報(HTTPセッションの情報)を利用することが多い。ただ、ロードバランサーの配下で複数のWeb/APサーバーを動作させている場合に、各Web/APサーバーでステート情報を持つようにすると、サーバー障害時またはサーバー数を意図的に減少させるとき、ステート情報が消失してしまう場合がある。
クラウドでの解決/パターンの説明
このパターンは、スケールアウト構成でステート情報を保持するためのもの。サーバーを増加したときのステート情報の引き継ぎや、サーバー台数が減少(障害含む)したときのステート情報の消失を防ぐ。ステート情報を耐久性の高い共有データストア(メモリー/ディスク)に置き、複数サーバーからその情報を参照する。そうすることで、サーバーにステート情報を持たせず、ステートレスにできる。新たにサーバーが追加されても共有データストアを参照できるため、ステート情報の引き継ぎが行われる。
実装
AWSのデータストアには、インメモリキャッシュサービスである「ElastiCache(Memcached、Redisインメモリーキャッシュ)」、NoSQL(KVS)データベースサービスである「DynamoDB」「SimpleDB」、リレーショナルデータベースサービスである「RDS」がある。これらのいずれにもステート情報を格納できるので、要件に合ったものを選択する。
- ステート情報を格納するためのデータストアを準備する。
- データストアには、ユーザーを特定するID(セッションIDやユーザーID)をキーにして、ユーザー情報を値として格納する。
- Web/APサーバーにステート情報を保管せず、データストアに保管して参照・更新を行う。
構造
利点
- ステート情報の引き継ぎや消失を気にすることなく、Scale Outパターンを利用できる。
注意
- 複数のWeb/APサーバーからのステート情報へのアクセスが1カ所に集中するため、データストアの性能がボトルネックにならないよう気を付ける必要がある。パフォーマンス要件が厳しい場合、高速でキャパシティを事前に予約できるDynamoDBの選択を検討する。
- 要件によっては、データストアとして「RDS(RDBMS)」「S3(インターネットストレージ)」を利用することもできるだろう。
その他
- DynamoDBのAWS SDK for PHPでは、State Sharingパターンをサポートしている。