httpはステートレスであるらしいがステートレスの意味を理解していない
ステートレスとは
「サーバがクライアントのアプリケーション状態を保存しない」制約のことです。
アプリケーション状態とは
ステートレスなやり取りではクライアント(客)は
毎回同じ注文内容を繰り返さなければならなかった
のに対し、ステートフルなやりとりでは注文の差分だけを追加で説明すれば良かった
からです。
ステートフルなやりとりは、サーバ(店員)がクライアントのそれまでの注文を、やりとりの間ずっと覚えていることを前提
にしています。
...
この「ハンバーガーセットをポテトで注文している」という情報のことを、クライアントのアプリケーション状態
と呼びます。
アプケーション状態は別名「セッション状態」
とも言います。システムにログインしてからログアウトするまでの一連の操作をまとめて「セッション」と呼ぶのですが、この一連の操作の間の状態はアプリケーション状態
のことですので、アプリケーション状態とセッション状態はほぼ同じ意味になります。
ログインしてからログアウトするまでの操作の情報を記憶しておいてくれるのがステートフルなのか。そしてその情報をアプリケーション状態というのか。
ステートフルの方が便利そうだな。
ステートフルの欠点
サーバがクライアントのアプリケーション状態を覚えることは、
クライアントの数が増えるにしたがって難しく
なっていきます。
...
複数のサーバ間でアプリケーション状態を同期して、どのサーバでも同じアプリケーション状態を扱えるようにしなければなりません
。
...
データを同期するオーバヘッドが無視できなくなります。
このようにステートフルなアーキテクチャでは、クライアントの数が増えた場合にスケールアウトさせにくくなります
。
複数のサーバあると同期しなければならずスケールアウトもしにくいのか。
ステートレスの利点
クライアントがリクエストメッセージに必要な情報を全て含めます
。
...
リクエストの処理に必要な情報をすべて含まれているメッセージのことを「自己記述的メッセージ
」と言います。ステートレスなアーキテクチャでは、サーバがクライアントのアプリケーション状態を覚える代わりに、クライアントが自らのアプリケーション状態を覚え、すべてのリクエストを自己記述的メッセージで送信
します。
...
サーバはそれまでのことは全て忘れて、新しく来るリクエストの処理に集中すれば良い
のです。この性質を利用すると、ステートレスなシステムをスケールさせることは簡単
になります。
クライアント自身が必要な情報を送ることでサーバに負担がかからないからスケールアウトしやすいのか。
ステートレスの欠点
送信するとデータ量が多くなる
ステートレスでは全ての情報を送りなおす必要があります。これは、
データ量によってネットワークの帯域を消費
することを意味します。
認証など、サーバに負担がかかる処理を繰り返す
データベースへのアクセスは重い処理ですので、これを
毎回繰り返すとパフォーマンスが落ちます
。
毎回送らないといけないからサーバに負担がかかるのか。
どちらにしてもサーバに負担がかかるのか。どっちを取るかなのか。
感想
ステートレスは良い面もあれば悪い面があるのか。