'アプリは状態を持つべきではありません。状態は、データベースがあるデータ層に保持する必要があります。
これが標準である設計があり、適切に「ステートレス アーキテクチャ」と呼ばれます。もちろん、すべてのアーキテクチャがステートレスであるべきかどうかは疑問であり、その用語自体もおそらく議論の余地があります。
実際、ほとんどの「ステートレス」アプリケーションには状態がありますが、上記のルールで述べられているように (駄洒落ではありません)、この状態は 1 つのグローバルな場所に保持されます。データベース。Peter が言及しているように、これの理由は保守性と単純化かもしれませんが、これはscalability
. データベース以外のどこにも状態が表示されないため、フロントエンド サーバー、処理サーバーなどを簡単に追加できると考えられています。
これには確かにメリットがありますが、一時的な状態と正式な状態を区別する必要があると思います。
一時的な状態とは、注文プロセス中の場所や、既に入力した詳細のようなものです。Java EE では、@ConversationScoped Bean や @Stateful Bean などでこれを保持できます。したがって、これは Web レイヤー resp 内に保持する状態です。ビジネス層。
これの利点は、使いやすさ、パフォーマンス、および単一の中央データベースのアンロードです。もちろん、一時的な状態を中央データベースに保存することもできますが、通常の非一時的なデータからこれを遠ざけたいと思うでしょう。これは、追加のプログラミングの複雑さが必要であることを意味します。また、通常、Web レイヤーからデータを取得する方がはるかに高速であり、データベースの負荷がいくらか軽減されます。
多くのシステムでは、単一のマスター データベース (書き込みを受け入れるデータベース) しか存在しないため、この単一のデータベースがそのセットアップで大きなボトルネックになる可能性があります。
実際のアーキテクチャと設定によっては、データベースに一時的な状態を保持しないことで、実際にスケーリング能力が向上する場合があります。
欠点は、一時的な状態が現在保持されている単一のサーバーにクライアントを固定する必要があることです。これは一般的に「スティッキー セッション」と呼ばれます。このクライアントが対話している 1 つのサーバーに障害が発生したり、再起動が必要になったりした場合、クライアントはこの一時データを失います。クラスター内のすべてのノードまたは近くのノードに状態をレプリケートする (バディ レプリケーション) などのスキームがいくつかありますが、これは状況をさらに複雑にし、ネットワークに過負荷をかける可能性があります (すべてのノードが常に相互にレプリケートしている場合)。
権限のある状態とは、唯一の情報源である共有データを表すことを意味します。この種の状態は、ほとんどの場合、中央の場所に配置したいと考えていますが、Web ノードなどに保存されている場合もあります。
たとえば、最近の価格のリストがあり、これを中央の場所に保持する代わりに、入力された Web ノードに保持するとします。現在、この情報を持つ「唯一無二の」Web ノードの概念があり、他のサーバーは、この「唯一無二の」Web ノードしかないと想定し始める可能性があります。この前提が崩れるため、ノードを追加することは現在不可能です。