2009-07-24 2 views

答えて

4

状態を使用すると、一般的にプログラマの仕事が楽になります。

しかし、ステートでは、ステートレスな状況では存在しないすべての並行性の問題も導入されています。

これは本質的に機能プログラミングと命令プログラミングの間の議論です。

+0

ウェブアプリケーションで "並行性の問題"がどのようなものであるのかよくわかりません... –

+0

サイト内に同時に2人のユーザーがいるとします。両者が同時に提出する場合、両者がデータベースや他のサービスにぶつかり、競争状態が続く可能性はありますか? – samoz

+6

しかしそれはデータベースの問題です。あなたのWebアプリケーションに状態を保存しているかどうかは関係ありません。 ACIDに準拠したデータベース(すなわち、すべてのリレーショナルデータベース)は、この種の問題を処理するために書かれています。 –

1

ユーザーがどのページ/ステージを簡単かつ簡単に追跡できるので、長いフォーム(実際には1ページ以上のページを更新するもの)は、永続的な状態でははるかに簡単です。しかし、私は個人的にはそれほど価値はないとは思っていませんが、問題のWebアプリケーションに大きく依存しています。

8

私たちのプロジェクトでは、Wicket Webフレームワークを使用してステートフルまたはステートレスの対話が可能です。ステートフルページは、多くの利点を有する:改札内のステートフルページを使用して

  • は、ステートフルは、より多くの「直感的」プログラミングモデルであることが容易
  • 改札のAJAXフレームワークを使用して部分的なページ更新を行うことが可能となります。たとえば、wicketページクラスでは、サーバーサイドでプライベートメンバーフィールドを宣言し、ページがロードされたときにそれを設定し、AJAXリクエストが更新を実行するためにページにヒットするたびに再度アクセスします。
  • Wicketは、要求を処理するときにユーザーセッションオブジェクトを同期させることで、Web層で最も一般的な並行性の問題を防ぎます。
  • サーバー側に状態を保存することができます時々パフォーマンスを向上させます。例えば、構築に時間がかかるがページ上で利用可能でなければならないオブジェクトは、ページが最初にインスタンス化されたときに一度しかロードされない。

ステートフルアプリケーションで可能なことは、ステートレスとして実装することもできます。クライアントにステートを格納し、すべての要求に関連するすべての状態情報を送信するだけで済みます。 http://wicket.apache.org/

1

を私が原因スケーラビリティにステートフルクライアント・ステートレスサーバーキャンプにいるよこれ、それはステートレスサーバーを使用して実装するために困難になった理由を説明するのハードルに直面したとき、あなたは親切取得:改札する

リンクこれはステートフルなサーバーが輝く場所です:)。 イベント私はステートフルなクライアントを好むが、これはasp.net viewstateを使って効率的に実装するのは簡単ではないし、ステートフルなWebが実用的になるかもしれない。 ステートフルなクライアントでステートレスなサーバーは、タイヤ間でやりとりされるデータの量をより意識してくれます。これは、ステートフルなサーバープログラミングモデルを使用してトラブルが発生するまで隠されることがあります。また、ステートレスからステートフルへの移行は簡単です(既に知っているので提供している状態情報を無視するだけです)。反対に行くことは、ほとんど不可能である/それの価値がない。ステートフルサーバーを使用するもう1つの方法は、ステートフルクライアントも使用しているときに、ステート/キャッシュをクリアすることはしばしば問題になることです。

GWTと他の多くの現代のツールキット(SilverlightとWCFとの対話)は、スケーラビリティの問題により、ステートフルなクライアント、ステートレスサーバーを好むようです。たぶん、ステートフルなサーバーは、ステートレスなルールの例外になるはずです... 1ページ/ウィンドウごとに選択できます。

源:あなたが高いトラフィックを持つ起動したときに http://groups.google.com/group/google-web-toolkit/browse_thread/thread/2871ef5076c1bdb6/43e7a5377047aa44?#43e7a5377047aa44

1

ステートレスWebアプリケーションが不可欠です。

たとえば、セキュリティ上の理由からクライアント側に保存したくないユーザーデータがたくさんある可能性があります。この場合、サーバー側に格納する必要があります。 Webアプリケーションのデフォルトセッションを使用できますが、アプリケーションのインスタンスが複数ある場合は、各ユーザーが常に同じインスタンスに誘導されるようにする必要があります。

負荷分散装置では、負荷分散装置がユーザー要求を送信するサーバーをどのように知っているかを「スティッキセッション」とすることができます。これは理想的ではありません。たとえば、Webアプリケーションを再起動するたびに、接続されているすべてのユーザーがセッションを失うことを意味します。

Webサーバーの背後にあるセッションをある種のデータストアに格納する方が良いでしょう。最近では、これに利用できる素晴らしいnosql製品があります(redis、mongo、elasticsearch、memcached)。このようにWebサーバーはステートレスですが、まだサーバー側に状態があり、この状態の可用性は適切なデータストア設定を選択することによって管理できます。これらのデータストアは通常、冗長性が高いため、ユーザーに影響を与えることなく、Webアプリケーションやデータストアに変更を加えることはほとんど可能です。

+0

私はOPの質問に正確に答えなかったと思います。しかし、私は答えが議論に合っていると感じました... – shmish111

関連する問題