web-dev-qa-db-ja.com

ステートレスとステートフル-具体的な情報を使用できます

プログラミングにおけるステートレスおよびステートフル設計に関する具体的な情報を含む記事に興味があります。私はそれについてもっと学びたいので興味がありますが、それに関する良い記事を見つけることができません。私は、主題について漠然と議論しているウェブ上の記事をたくさん読んだり、ウェブサーバーやセッションについて話していたり​​します-また、「ステートフル対ステートレスについて」ですが、コーディングの属性のステートレス対ステートフル設計に興味があります。例:BLクラスは設計上ステートレスであり、エンティティクラス(または少なくとも私がそれらと呼ぶ-Person(id、name、..)など)はステートフルであると聞いたことがあります。

私はそれを理解することができれば、より良いコードを書くことができると信じているので、知っておくことが重要だと思います(例えば粒度を念頭に置いて)。

とにかく、本当に短い、ここで私が知っているのは「ステートフル対ステートレス」です:

ステートフル(WinFormsなど):さらに使用するためにデータを保存しますが、CPUまたはメモリの制限によって制限されるため、アプリケーションのスケーラビリティを制限します

ステートレス(ASP.NETと同様-ASPはViewStateでステートフルになりますが):アクションが完了すると、データが転送され、インスタンスがスレッドプール(アモルファス)に戻されます。

ご覧のとおり、かなり曖昧で限られた情報であり(そしてサーバーインタラクションに焦点を当てています)、よりおいしい情報を提供していただければ本当にありがたいです:)

85
Team-JoKi

StackOverflowの question から始めて、ステートレスプログラミングの利点を説明することをお勧めします。これは、関数型プログラミングのコンテキストでの詳細ですが、他のプログラミングパラダイムでも読むことができます。

ステートレスプログラミングは、関数の数学的な概念に関連しています。関数は、同じ引数で呼び出された場合、常に同じ結果を返します。これは、関数型プログラミングパラダイムの重要な概念であり、その分野で多くの関連記事を見つけることができると期待しています。

理解を深めるために調査できるもう1つの分野は、RESTful Webサービスです。これらは、何らかの方法で状態を維持しようとする他のWebテクノロジーとは対照的に、設計上「ステートレス」です。 (実際、ASP.NETはステートレスであると言うことは正しくありません。ASP.NETはViewStateを使用して状態を維持しようとし、ステートフルとして明確に特徴付けられるようにします。一方、ASP.NET MVCはステートレステクノロジです。 RESTful Webサービスの「ステートレス」について議論する場所はたくさんあります( this ブログスポットなど)が、SO question から再び始めることができます。

51
kgiannakakis

Statelessは、過去の記憶がないことを意味します。すべてのトランザクションは、初めて行われたかのように実行されます。

Statefulは、過去の記憶があることを意味します。以前のトランザクションは記憶されており、現在のトランザクションに影響する場合があります。

ステートレス:

// The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

ステートフル:

// The state is maintained by the function

private int _number = 0; //initially zero

function int addOne()
{
   _number++;
   return _number;
}

参照元:https://softwareengineering.stackexchange.com/questions/101337/whats-the-difference-between-stateful-and -stateless

71
Ankit

ステートフルアプリは、実行を開始してから何が起こったか、または何が変更されたかに関する情報を保存するアプリです。それがどの「モード」であるか、何件のレコードが処理されたかなどに関する公開情報は、それをステートフルにします。

Statelessアプリはその情報を一切公開しません。毎回、同じリクエスト、関数、またはメソッド呼び出しに対して同じ応答を返します。 HTTPは生の状態ではステートレスです。特定のURLに対してGETを実行すると、毎回(理論的に)同じ応答が返されます。もちろん例外は、ステートフルネスの追加を開始するときです。 ASP.NET Webアプリで:)しかし、HTMLファイルと画像のみを含む静的なWebサイトを考えると、私が何を意味するか知っているでしょう。

71

形容詞のステートフルまたはステートレスは、会話の状態のみを指し、同じ入力に対して同じ出力を提供する機能の概念とは関係ありません。その場合、動的Webアプリケーション(データベースが背後にある)はステートフルサービスになりますが、これは明らかに誤りです。これを念頭に置いて、基盤となるテクノロジー(coockieやhttpセッションなど)で会話状態を維持するタスクを委任する場合、ステートフルサービスを実装しますが、必要な情報(コンテキスト)がすべてパラメーターとして渡される場合、ステートレスサービスの実装。渡されたパラメーターが会話状態の「識別子」(チケットやsessionIdなど)であっても、会話はステートレスであるため(チケットはクライアントとサーバー)、およびいわば「ステートフル」になる2つのエンドポイントです。

17
Marco

あるアカウントから別のアカウントにオンラインで送金されたお金はステートフルです。これは、受取側のアカウントが送信者に関する情報を持っているためです。ある人から別の人に現金を引き渡す場合、この取引は無量です。なぜなら、現金が受け取られた後、贈与者の身元が現金とともにないからです。

4
S Upendra rao

他の人の貢献を追加するだけです...別の方法は、Webサーバーと並行性の観点からそれを見ることです...

HTTPは理由によりステートレスです... Webサーバーの場合、statefulは、最後の接続のユーザーの「状態」を記憶する必要があること、および/またはリクエスターへの接続を開きます。数千の同時接続があるアプリケーションでは、それは非常に高価で「ストレスの多い」ものになります...

ステートレスであると、リソースの効率的な使用が明らかになります...つまり、要求と応答の単一インスタンスで接続をサポートします...接続を開いたままにしておく、および/または最後のリクエスト...

1
Ken.Fukizi

セッションオブジェクトを使用してHTTPステートレス動作をオーバーライドすることにより、Webappsをステートフルにします。セッションオブジェクトを使用する場合、ステートは保持されますが、HTTPのみを使用します。

ステートフル対ステートレスクラスの設計についても同じ疑問を抱き、いくつかの研究を行いました。完了し、私の調査結果が 私のブログ に投稿されました

  • エンティティクラスはステートフルである必要があります
  • ヘルパー/ワーカークラスはステートフルであってはなりません。