3

別々のプロセスで .net オブジェクトを「共有」しようとしています。ドメイン エンティティのセットを操作する Web サービスである 1 つのタイプのプロセスがあります。もう 1 つのタイプのプロセスは、同じオブジェクト セットに対して何らかの自動バッチ処理を実行するウィンドウ サービスです。

両方のタイプのプロセスがオブジェクトの読み取り/書き込みを行う共有スペースとして DB を使用するという一般的なソリューションを超えて、これらの異なるプロセスが同じオブジェクトを参照して処理するためのより優れた、より分散されたアーキテクチャは何でしょうか?

オブジェクトの共有ストアとして分散キャッシュを使用することを検討しましたが、それはオブジェクトとその関係を完全にはサポートしていません。分散キャッシュに挿入されたオブジェクト グラフはフラット化され、オブジェクトは複数の切断されたコピーに格納されることになります。

プロセスがオブジェクトの更新されたコピーを相互に送信できるようにする「メッセージング バス」は正しい方法ですか?

それとも、他に考慮すべき解決策はありますか?

4

3 に答える 3

2

WCF サービスを使用することをお勧めします。ローカルで使用する (Windows サービスから呼び出す) 場合は、netNamedPipeBinding を使用できます。これにより、将来、この 2 つのプロセスを物理的に分離することができます。

于 2009-04-18T17:57:11.033 に答える
1

2 つのサービスのどちら、またはまだ書かれていないサービスの 3 番目のサービスが、ドメイン オブジェクトの信頼できるソースであるかを判断する必要があります。

信頼できるソースによって公開されるリモート処理または WCF ベースの一連のサービスは、オブジェクト グラフの中心的な場所を提供する必要があります。ただし、オブジェクトの分散キャッシュを単純に作成していると思います。

Velocity Projectを検討しましたか?

于 2009-04-18T18:03:30.177 に答える
1

私たちのプロジェクトでは、ScaleOut StateServer (商用製品 - www.scaleoutsoftware.com ) を使用て、同様の目的でサーバー ファーム全体でオブジェクトの分散キャッシュ/レプリケーションを実現しました。これは非常に効果的ですが、オブジェクトを使用すると (逆) シリアル化のコストが発生するため、多くの場合、保存するものを単純化して、可能な場合は文字列値だけにします。

Velocity Project が存在する前に使用が開始されたため、Velocity Project を完全に評価したわけではなく、現時点で切り替えを検討する時間も説得力のある理由もありませんが、今すぐ開始する場合は明らかに調査が必要です.

編集:私は確かに、質問に関する重要な部分、つまりオブジェクト参照の平坦化を見逃していました。これは物事を過度に複雑にしたり、他の欠点を持ったりする可能性がありますが、分散キャッシュ内のデータベース ストレージをより綿密にシミュレートするアプローチを採用した場合はどうなるでしょうか (各オブジェクト エンティティの単一のコピーを格納し、より緩い参照を使用してそれらをリンクするようにします)。エンティティを一緒に)?

例: 'Leader' プロパティと 'Members' コレクションを持つクラス 'Group' があり、すべてが 'Person' クラスのインスタンスであるオブジェクトを含んでいます。カスタムシリアライゼーションを使用してそれを実現する必要があり、同時実行/ダーティアップデートの問題を魔法のように解決するものは何もありませんが、分散キャッシュに入れるものは実際にはすべて個別の「Person」インスタンスになるという考えです。 「グループ」インスタンス自体の浅いコピーとして。その浅いコピーは、通常の「グループ」プロパティ (名前など) と、それに含まれる各「個人」参照の一意の識別子 (元のデータベース ID、GUID、一意のユーザー名、または適切なものなど) をシリアル化します。 Person オブジェクト自体。だからあなたは「LeaderID」を持っているでしょう リーダーの代わりに、Members コレクションは MemberID のリストとしてシリアル化されます。参照される各 Person も個別のオブジェクトとして格納されます。ここで、並行処理のトリッキーさが発揮されます。

逆シリアル化するとき (または使用パターンに応じてアクセス時)、グループの浅いコピーはすべての Person ID 参照に従い、分散キャッシュに個別に格納された実際の Person オブジェクトでそれらの参照を再水和します。多くの異なるグループ間で共有される可能性のあるオブジェクトへの更新が安全であることを確認するには、ロック メカニズムを実装する必要があります。また、分散キャッシュ内で行われた Person オブジェクトへの変更を再読み取り/取得するために、必要に応じてバージョン管理メカニズムと「ダーティ チェック」が必要になります。

かなり複雑に思えますが、ユースケースの詳細を知らなくても、私が考えることができる最も一般的なアプローチです。

于 2009-04-18T18:09:17.760 に答える