'アプリは状態を持っていないと思われます。状態は、データベースがあるデータレイヤーに保持されるべきです。
「ステートレスアーキテクチャー」と呼ばれる標準的なデザインがあります。すべてのアーキテクチャがステートレスでなければならないかどうかはもちろん疑問であり、まさにその言葉は議論の余地があるかもしれません。
ほとんどの「ステートレス」アプリケーションは、実際には状態を持っていますが、上記の状態(馬小屋なし)のルールとして、この状態は1つのグローバルな場所に保持されます。データベース。 Peterが言及しているように、これは保守性と簡素化の理由がありますが、これはscalability
のものであるとよく聞かれます。データベース以外には何も表示されない状態でも、フロントエンドサーバーの追加、サーバーの処理、そして何を持っているのかは簡単に考えられます。
これにはいくつかメリットがありますが、一時的な状態と権限のある状態を区別しなければならないと思います。
一時状態は、ご注文手続きの際の場所や既に入力した詳細のようなものです。 Java EEでは、これを例えば次のようにしておくことができます。 @ConversationScoped Bean、または@Stateful Beanです。これは、あなたがウェブレイヤー内に保持している状態です。ビジネス層。
この利点は、使いやすさ、パフォーマンス、および単一の中央データベースのアンロードです。もちろん、中央データベースに一時的な状態を保存することもできますが、これを通常の非一時的なデータから離しておくと、プログラミングの複雑さが増すことがあります。また、通常、Webレイヤーからデータを取得する方がはるかに高速で、データベースからいくらかの負荷を取り除きます。
多くのシステムでは、単一のマスターデータベース(書き込みを受け入れるデータベース)しかないため、この単一のデータベースは、そのセットアップで大きなボトルネックになる可能性があります。
実際のアーキテクチャとセットアップによっては、ではなく、というデータベースで一時的な状態を維持することができます。
一時的な状態が現在保持されている単一のサーバーにクライアントが固執する必要があるという欠点があります。これは典型的には「スティッキセッション」と呼ばれます。このクライアントが対話している1つのサーバーが失敗したり、再起動が必要な場合、クライアントはこの一時的なデータを失います。クラスタ内のすべてのノードまたは近くのノード(バディレプリケーション)に状態を複製するようなスキームがいくつかありますが、これは事態をさらに複雑にし、ネットワークを過負荷にする可能性があります(すべてのノードが常に複製している場合)。
信頼できる状態は、唯一の情報源である共有データを表すことを意味します。この種の状態は、ほぼ常に中央の場所にあるようなものですが、場合によってはそれが、ウェブノード。
たとえば、最近の価格のリストがあり、これを中央の場所に保存するのではなく、入力されたWebノード上に保存します。今、この情報を持つ「唯一の」Webノードという概念があり、他のサーバーはこの「唯一の」Webノードしかないと仮定して始めることができます。追加のノードを追加することは、この前提を壊すので不可能です。
まあ、私のコードを見ている人は、オブジェクトの作成にはウェブレイヤーが高価だと言っていました。 CPUコストにかかわらず、我々はそれを非常に概念的に保ちます。前述のアプローチは設計を単純化するために使用されるかもしれませんが、私はそれが実際には意図されたものではないと思います。その人は「ユーザーがWebページにアクセスするたびに、その人のプロファイルマネージャーを新しくしてそこからプロファイルデータを取得しています」これは非常にコストがかかります。後でそれをアプリケーション属性から取得してアクセスしてください。 app.setAttribute(m) – MrStack
「プロファイルマネージャ」はDAOやサービスのようなものですか?一般に、1つの要求につき小規模の固定数のオブジェクトを作成することは、「コストがかかりすぎる」場合はめったにありません。現代のJVMでは、オブジェクトの割り当てが非常に高速です。もちろん、それが必要ないのなら、このマネージャーは効果的にシングルトンなので、作成しないでください(しかし、その場合、静的メソッドを使用するだけでなく、一見0のインスタンスも同様ですか?) –
単純なオブジェクトを作成する行為は、約10 nsの費用がかかります。それらの多数を作成することができますが、百万も許容されるかもしれません。コストが非常に高くなる可能性があるのは、外部ソースに基づいて情報を構築する必要がある場合です。 1つのデータベースクエリでは10ミリ秒かかりますが、1つのプロファイルでそれらの多くを実行する必要がある場合は、すぐに1秒程度になることがあり、毎回行うのは得策ではありません。 –