ステートレスvsステートフル-いくつかの具体的な情報を使用できます


93

プログラミングにおけるステートレスおよびステートフルデザインに関する具体的な情報が含まれている記事に興味があります。もっと詳しく知りたいので興味がありますが、良い記事は本当に見つかりません。私は漠然とテーマについて説明しているWeb上の何十もの記事を読んだり、Webサーバーやセッションについて話していたり​​します。 。例:BLクラスは設計上ステートレスであると聞いたことがあります。エンティティクラス(または、Person(id、name、..)のように、少なくとも私がそれらと呼ぶもの)はステートフルなどです。

私はそれを理解できれば、より良いコードを書くことができると信じているので、知っておくことが重要だと思います。

とにかく、本当に短い、これが私が知っていることです 'ステートフル対ステートレスについて:

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

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

ご覧のように、それはかなりあいまいで限られた情報(そしてサーバーとの対話にかなり焦点を当てています)なので、もっとおいしい情報を提供していただければ本当にありがたいです:)

回答:


58

ステートレスプログラミングの利点を説明するStackOverflowの質問から始めることをお勧めします。これは関数型プログラミングのコンテキストでより多くですが、あなたが読むものは他のプログラミングパラダイムにも適用されます。

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

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


さて、情報をありがとう、私はリンクを見て、いくつかの興味深い情報を見つけました!私はまだまだオープンしていますが;)
Team-JoKi

ステートフルとステートレスが重要な要素である別の領域を追加しました(RESTful Webサービス)。
kgiannakakis

情報をありがとう!私はあなたの回答に投票しますが、まだ十分な担当者がいません> _>
Team-JoKi

多くのWebアプリはステートフルであるため、同じサインアップページはユーザークレジットに対して異なる結果をもたらします...初回サインアップは成功します...同じ入力サインアップで2回目は失敗します... webappにはユーザーの状態がどこかに保存されているためです。 .ITは、データベースまたはdifferantストレージかもしれ
フィールグッドとプログラミング

83

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

ステートフルとは、過去の記憶があることを意味します。以前のトランザクションは記憶されており、現在のトランザクションに影響を与える可能性があります。

ステートレス:

// 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


73

ステートフルなアプリは1であることが起こったか、それが実行を開始以降に変更されたかについての情報を格納しては。それがどの「モード」にあるか、または処理されたレコードの数などの公開情報は、それをステートフルにします。

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


18

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


session identifierすべてのリクエストでを渡すことがステートレスと見なせるかどうかはわかりません。私の見解では、このようなケースはステートフルと見なされます。ただし、常にtokenユーザーにa を渡しますが、ステートレス以外の状態は保持しません。しかし、ステートフルなXDを感じます。これはとても混乱しています。
7hi4g0 2014年

4

あるアカウントから別のアカウントにオンラインで送金された金額は、受取人のアカウントに送信者に関する情報があるため、ステートフルです。現金を人から別の人に渡す場合、このトランザクションは無意味です。現金が回収された後、寄付者の身元が現金にないためです。


1

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

HTTPは本来、ステートレスです。理由は... Webサーバーの場合、ステートフルであることは、最後の接続のユーザーの「状態」を記憶し、リクエスタへのオープン接続を維持する必要があることを意味します。これは、数千の同時接続を持つアプリケーションでは非常に高価で「ストレス」になります...

ビーイングステートレス、この場合には、資源の明白な効率的な使用を持っている...つまり、要求と応答の単一のインスタンスででの接続をサポートして...オーバーヘッドのオープン接続を維持および/または最後の要求から何かを覚えているのはありません...


-3

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


-3

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

  • エンティティークラスはステートフルである必要があります
  • ヘルパー/ワーカークラスはステートフルであってはなりません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.