はじめに
現代のシステム設計において、「ステートレス」と「ステートフル」の概念を理解することは極めて重要です。
ということを多くの記事で拝見しますが、そもそもこの2つの概念は何か、両者の基本的な定義から、具体的な使用例をまとめました。
この概念が理解できると、セッション管理など、他の場面で応用できます。ここで押さえておきましょう。
ステートレス (Stateless)とは
各リクエストが独立して処理され、サーバーは前回のリクエスト情報を保持しない設計のことを指します。
各リクエスト(HTTPリクエストなど)は独立して処理され、サーバーはクライアントの状態を記憶しません。
ここでいう状態とは、サーバーがクライアント(ユーザーや端末)に関する行動やデータを記憶している情報のことを指します。
ステートレスとは、「状態を保持しない」という状態で、相手のことも相手が過去にしたことも覚えていないことを言います。
イメージ:一見さん
この例では、お客(クライアント)が注文をオーダーし、店員(サーバー)がそれを受け取り返事をしています。
日常世界においては、店員はこの後もお客のリクエスト(オーダー)を覚えていますが、ステートレスはそうではありません。
お客が数分前にオーダーした内容を店員に確認すると、店員は過去のオーダー内容を覚えていないと返事をします。
店員側では過去の記憶はなくなるので、お客が誰で何のことを言っているのかわからないという事態になります。
このように、一回の会話ごとに内容が完結し、後に記憶されず常に一見さん状態なのがステートレスなのです。
実際にこのような状態が日常的にあると困ってしまうものですが、サーバーは1人だけを相手にしているわけではなく、不特定多数の人を相手にします。そのため、リクエストを受け付ける度に前回の記憶を思い出す作業を行なうと、それだけ労力を使うことになります。
私たちも1対1の会話ではスムーズにコミュニケーションを取れますが、一度に複数の人から話しかけられると対応に困ってしまうのと同じなのです。
このように、1回の会話ごとにコミュニケーションが完結することで以下のことが可能になります。
① スケールアウトしやすい
サーバーやシステムの規模を拡張して処理能力を上げることを意味します。
サーバーが状態を保持しないということは、リクエストを記憶しておく必要がないため、どのサーバーで処理しても結果は同じになります。仮にサーバーが状態を記憶していた場合、その記憶を別場所にコピーする手間(コスト)がかかってしまいます。その手間(コスト)がないため、その分素早く対応できるのです。
※サーバーを増やすことによって、大量のリクエスト・アクセスを裁くことができるようになります。
② ロードバランサーによる振り分けの高速化
私たちがリクエストを送ると、そのリクエストをどのサーバーで処理するか、調整してくれる機能をロードバランサーは持っています。どのサーバーで処理しても結果が同じであるならば、ロードバランサーは単純に空いているサーバーにリクエストを割り振るだけで済むので、対応が早くなります。
③障害に強くなる
ステートレスでは、状態を持たず、リクエストごとに必要な情報をすべて含めるため、どこかに前回の情報を記憶しておく必要がありません。そのことにより、仮にサーバーがダウンしても、セッション情報(前回の記憶)が失われないため、サーバー障害による影響が少なくなります。
ステートフル (Stateful)とは
サーバーがクライアントの状態(前回の会話の内容やその人の情報)を保持することを指します。前回の記憶が残っている状態です。これが「状態を保持する」という状態です。
この場合、サーバーがクライアントの情報を記憶することになるため、その分ステートレスな場合に比べメモリやリソースを消費することになります。
お客のオーダーを受け付けると、このお客のこととオーダー内容を記憶します。これにより、例えば、数日前に来店していた場合、前回の記憶を辿ってお客特有の好みを把握し、新たな提案ができます。前回のことを記憶しているため、コミュニケーションを円滑に進めることができるようになります。
状態を持つことにより、以下のようなことが可能になります。
① 毎回データを送る必要がない
サーバーが状態を覚えているため、毎回データを送る必要がなく、パフォーマンスが向上する場合があります。
例えば、ログインしたユーザーが過去に注文したものを記憶することで、ユーザー自身が過去に注文した商品や日時を確認することができます。
② 複雑な処理ができる
ログイン状態を保持したり、ネットショッピングにおいて商品購入手続きを円滑に行えるようになったりします。
状態を一元管理しているため、その情報を活用した処理ができるようになります。
③ リアルタイム処理に適している
リアルタイムでのビデオ通話やゲームサーバーなど、継続的な接続が必要な場面で効果を発揮します。
まとめ
今回はステートレスとステートフルのそれぞれの特徴を解説しました。2つの選択はトレードオフで、ステートレス設計はスケーラビリティとシンプルさを実現でき、ステートフル設計はパフォーマンスとユーザーにとってメリットの多い機能を提供します。このような特徴を押さえたうえで、システムを設計していきましょう。
最後までお読みいただき、ありがとうございました。
参考・画像引用元URL
https://qiita.com/DProSchool/items/c48ce9beae449e39ef4c
https://otonan-syusyoku.work/archives/1569
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031900052/062400004/
https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6
https://www.kagoya.jp/howto/it-glossary/network/loadvalancer/