在我們的項目中,我們使用ScaleOut StateServer(一種商業產品 - www.scaleoutsoftware.com)來實現整個服務器場中分佈式緩存/複製對象的類似用途。儘管使用對象確實會導致序列化成本,但這在很大程度上是非常有效的,所以在很多情況下,我們會簡化存儲的內容,以儘可能地串入字符串值。
我們還沒有完全評估Velocity項目,因爲我們的使用開始之前已經存在,我們沒有時間或有說服力的理由來考慮在這一點上的轉換,但這顯然需要一些調查,如果你只是現在開始。
編輯:我確實錯過了關於這個問題的重要部分 - 扁平對象引用。這可能是過度複雜的事情或者有其他缺點,但是如果採取更接近模擬分佈式緩存中的數據庫存儲的方法(保留它存儲每個不同對象實體的單個副本,並使用更寬鬆的引用來鏈接那些實體在一起)?
示例:您有一個'Group'類,它具有'Leader'屬性和'Members'集合,它們都包含作爲'Person'類實例的對象。你不得不使用自定義序列化來解決它,沒有什麼會奇蹟般地解決併發/髒更新問題,但是這個想法是,你放入分佈式緩存的實際上是所有個人的'Person'實例作爲「Group」實例本身的淺表副本。該淺拷貝將序列化正常的'Group'屬性(名稱等),以及包含在每個'Person'引用中的唯一標識符(如原始數據庫ID,GUID,唯一的用戶名或任何適用的),而不是Person對象自己。因此,您將擁有「領導者ID」而不是領導者,並且會員集合將序列化爲MemberID的列表。每個引用的人也存儲爲一個單獨的對象;這就是併發技巧發揮作用的地方。
反序列化時(或訪問,這取決於使用模式),本集團淺拷貝將遵循所有的人ID引用,並重新水合物與真人那些引用的對象分別存儲在分佈式緩存。你需要實現鎖定機制,以確保更新這些對象,這些對象可以在許多不同的組中共享,這是安全的。您還需要一個版本控制機制和一個「髒檢查」,以便重新讀取/接收對分佈式緩存中對Person對象所做的任何更改。
它似乎很複雜,但是這是最通用的方法不知道您的使用案例的具體情況,我能想到的。
呀,WCF使用命名管道是去與此的方式。 – Noldorin 2009-04-18 18:16:30
我知道我可以使用WCF在流程之間來回拖曳對象,但這只是管道。我的問題是 - 使用什麼策略? 一個進程擁有所有對象還是它們在進程之間分配?當一個進程改變一個對象時,其他進程如何意識到這一點?他們是否拉動更新或被推?等等 – urig 2009-04-19 08:11:52
「對象」確實意味着一些域對象?像客戶,產品等? 如果是這樣,我建議使用DTO(數據傳輸對象)來傳輸他們的數據。每個進程都有自己的「對象」副本。 你可以使用樂觀鎖定策略(在每個對象中都有特殊字段)來解決concurreny問題。 – Shrike 2009-04-19 11:36:36