私たちのプロジェクトでは、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 オブジェクトへの変更を再読み取り/取得するために、必要に応じてバージョン管理メカニズムと「ダーティ チェック」が必要になります。
かなり複雑に思えますが、ユースケースの詳細を知らなくても、私が考えることができる最も一般的なアプローチです。