ステートレスとは


今回の学習テーマ

ステートレスとは

背景

RESTの4つの設計原則においてステートレスというキーワードが出てきて「何が違うんだろ。絶対ステートはフルのほうがいいでしょ」と気になったため。

Video / 書籍 以外で行ったことは?

Qiitaの記事を参照

学んだことの概要を、知らない人に説明してみよう

ステートレスとは

ステートとは「状態」を意味する。
よってステートレスは「状態がない」という意味になる。
ステートレスなやり取りにおいてサーバーはクライアントのセッション情報を保持せず、逆にステートフルなやり取りにおいてはセッション情報が保持される。

ステートレスとステートフルって結局どう違うの?

なんか良さげなことは理解できたが、実際どう違うのか
これは有名なハンバーガー店に置き換えた例をみると理解しやすい

(ステートフルの例):
客: こんにちは
店員: いらっしゃいませ。○○バーガーへようこそ
客: ハンバーガーセットをお願いします
店員: サイドメニューは何になさいますか?
客: ポテトで
店員: ドリンクは何になさいますか?
客: ジンジャーエールで
店員: +50円でドリンクをLサイズにできますがいかがですか?
客: Mでいいです
店員: 以上でよろしいですか?
客: はい
店員: かしこまりました

(ステートレスの例):
客: こんにちは
店員: いらっしゃいませ。○○バーガーへようこそ
客: ハンバーガーセットをお願いします
店員: サイドメニューは何になさいますか?
客: ハンバーガーセットをポテトでお願いします
店員: ドリンクは何になさいますか?
客: ハンバーガーセットをポテトとジンジャーエールでお願いします
店員: +50円でドリンクをLサイズにできますがいかがですか?
客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします
店員: 以上でよろしいですか?
客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします。以上
店員: かしこまりました

一見、ステートフルのほうが、いちいちハンバーガーセットを頼むという旨をつたえなくていいため賢いと思われる。
実際にやとうなら絶対にステートフルな店員ですよね。

 ステートレスの何が良いのか

実社会で雇うなら、間違いなくステートフルな店員のほうなのですが、Webの世界では勝手が違うようで、、。

ステートレスを導入することでこのようなメリットある。

サーバ資源をすぐに開放できるという利点があり、利用者や負荷におういて性能や機能を向上させられる

これは具体的にはどういうことなのか
これもハンバーガー店に置き換えて考えるとわかりやすい。

客: こんにちは
店員1: いらっしゃいませ。○○バーガーへようこそ
客: ハンバーガーセットをお願いします
店員2: サイドメニューは何になさいますか?
客: ハンバーガーセットをポテトでお願いします
店員3: ドリンクは何になさいますか?
客: ハンバーガーセットをポテトとジンジャーエールでお願いします
店員4: +50円でドリンクをLサイズにできますがいかがですか?
客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします
店員5: 以上でよろしいですか?
客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします。以上
店員6: かしこまりました

店員をサーバーととらえて考えると、
店員が一人の客にずっと対応していると、その間は他の客に対応することができない。店が混んできたら(アクセスが増加したら)、店員を増員して(WEBサーバを増設して)対応する。

普通の店舗では一つのレジで一人の店員がずっと同じ客を受け付けるのだが、WEBの場合は複数のWEBサーバで複数のクライアントを同時にうけつけるため、ステートレスサーバであれば、上記の様に各インタラクションで別々の店員が客の注文をに応答することが可能になる。

つまり、事情を知らない人(異なるサーバ)でも対応できるように、すべての情報をはじめから投げてあげるというのがステートレスなのである。

ステートレスのデメリット

* パフォーマンスの低下
送信するデータ量が多くなる
認証などのサーバに負荷がかかる処理を繰り返す

  • 通信エラーへの対応が大変 レスポンスがうまく受け取れなかった場合にリクエストを2重に受け付けてしまう ステートフルであれば、既にリクエストを受け付けたことを覚えている。

まとめ

ステートレスとは

  • リクエストには、処理に必要な情報を含む
    ステートフルとは異なり、自己完結型である

  • サーバ資源をすぐに開放できるという利点があり、利用者や負荷におういて性能や機能を向上させられる

  • アプリケーションの状態を覚える必要がないため、サーバ側のシステムは単純になる

今回得た気づき

  • 毎回毎回、値を投げるのってだるくねと思っていたが、理由がわかった。

  • フロントとバックを分けるからこそのテクなんだろうなと。

参考記事

RESTfulとは
RESTful APIとは何なのか
REST入門 基礎知識
ステートレスとは何か