クライアント/サーバーアプリケーションでステートステートレスを解決する方法は?

StackOverflow https://stackoverflow.com/questions/1636277

質問

ステートレスWebサイトの作成に関する本をいくつか読みました。ステートフルクライアントアプリケーションについても読みましたが、両方を組み合わせる必要がある場合、多くの複雑さが伴います。 .NETサービスを介してデータベースにデータを保持する必要があるFlexアプリケーションがあります。留意すべきことは次のとおりです。 -並行性(楽観的/悲観的) -パフォーマンス:Flexは大量のデータを読み込む必要があるため、遅延読み込みが必要になることがよくあります。 -Dtoを使用してサーバーとクライアント間でデータを転送しますか?

製品の歴史を説明します。 Sub / Sonicを最初からO / Rマッパーとして使用しました。 SubSonicオブジェクトは私たちが書いたdtoに変換され、これらのdtoはクライアントに転送されます。クライアント側のdtoはドメインモデルに変換されます。クライアント側のドメインモデルオブジェクトを保存する必要がある場合、オブジェクトはdtoに変換されてサーバーに送信されます。サーバー側のdtoは亜音速オブジェクトに変換され、データベースに保存されます。

今、しばらく前に、.NETサーバー側にドメインモデルが必要でした。そのため、サーバー側には亜音速モデル、dtoモデル、ドメインモデルの3つのモデルがあります。 dtoモデルはよりシンプルで、データベースにより似ています。ドメインモデルには、より多くのロジックがあります。複雑になります...次に、AS3ドメインモデルコードをC#ドメインモデルコードと同期する必要があります。 (リファクタリングの時間をとって)再度行うことができれば、dtoを使用せずに、クライアントとサーバー間でドメインモデルを転送すると思います。問題は、これが現実的かどうかです。 Dtoは転送が簡単なシンプルなオブジェクトです。ドメインモデルオブジェクトは非常に複雑になる場合があります。

これらの種類のアプリケーションのアーキテクチャを作成する方法に関する本はありますか?経験豊富な人が書いた本?これで経験はありますか?

役に立ちましたか?

解決

現実には、クライアントとサーバー間でオブジェクトを共有することは非常に複雑です。これを実現するために必要なものは次のとおりです。

簡単/スケーラブルでない方法:

MarshalByrefObject からすべてのオブジェクトをすべて継承します。サーバーでオブジェクトAを作成し、クライアントに送信すると、オブジェクトに対するクライアントの変更はすべて自動的にサーバーに転送されます。

これは完璧なソリューションのように聞こえますが、2つの大きな問題があります:

  1. クライアントとサーバーは.NET(bye-bye Web Services)と密結合しています
  2. パフォーマンスの悪夢である可能性があります。すべてのメソッド/プロパティアクセスがサーバーに転送されます。このルートを選択する場合、オブジェクトはおしゃべりな呼び出しではなく、チャンキーな呼び出し用に設計する必要があります。

スケーラブル/ハードな方法:

MarshalByRefObject を使用する代わりに、 DataContract / Serializable オブジェクトを使用します。ただし:

  • サーバーでオブジェクトA を作成し、クライアントに送信すると、 クライアントはオブジェクトのコピーを受け取ります(オブジェクトB と呼びましょう)
  • オブジェクトB をサーバーに送り返すと、サーバーは オブジェクトBのコピーオブジェクトC と呼びましょう)

しかし、サーバーがオブジェクトA オブジェクトC を同じものとして扱うことを本当に望んでいます。残念ながら、CLRはこれを行うことができないため、クライアントとサーバーの両方に配置するには Object Merger が必要になります。

オブジェクトマージには、モデル内のすべてのオブジェクトのディクショナリが含まれ、2つのインスタンスが同じであると識別し、受信側からの値をマージする方法がわかります。たとえば、クライアントのメモリにオブジェクトCが既に存在し、サーバーから更新されたコピーを受信した場合、クライアントは値をコピーします。

残念ながら、オブジェクト参照が正しく保持されるようにする必要があるため、これも問題を抱えています。オブジェクトが他のオブジェクトへの既存の参照を持っている可能性があるため、オブジェクトのすべてのプロパティを盲目的に更新することはできません。さらに、リストまたは辞書に含まれる追加/削除されたオブジェクトを追跡する必要もあります。

n層のサポートを自分のフレームワークに追加するので、今すぐ同じ演習を行っています(「スケーラブル/ハード」ルートを取っています)。幸いなことに、識別、マージなどを支援するためのサポートインフラストラクチャがたくさん用意されています。ゼロから始める場合、それは非常に重要な作業になります。

PS遅延読み込みプロキシをミックスに追加し(私はNhibernateを使用しています)、さらにもっとおもしろくなります...

他のヒント

Fowlerが書いたもの、特に彼のデザインパターン(特にアセンブラパターンと、すでに行っていることを必要とする理由)を読んでください

ファウラーのエンタープライズアプリケーションアーキテクチャのパターン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top