2009-04-18 98 views
3

我試圖在不同的進程間「共享」.net對象。我有一種類型的流程,它是一個處理一組領域實體的Web服務。另一種類型的進程是一個窗口服務,它對同一組對象進行自動批處理。如何在.NET中跨進程共享對象?

除了將數據庫作爲共享空間的兩種類型的進程讀取/寫入對象的典型解決方案之外,什麼可能是更好,更分散的體系結構,讓這些不同的進程看到並處理相同的對象?

我曾考慮過使用分佈式緩存作爲對象的共享存儲,但是這並不完全支持對象及其關係。插入到分佈式緩存中的對象圖被展平並且對象最終存儲在多個分離的副本中。

「消息傳遞總線」是正確的方式,讓流程互相發送對象的更新副本嗎?

或者還有其他解決方案要考慮嗎?

回答

2

我會建議使用WCF服務。對於本地使用(從Windows服務調用),您可以netNamedPipeBinding。這可以讓你在未來從物理上分離這兩個過程。

+0

呀,WCF使用命名管道是去與此的方式。 – Noldorin 2009-04-18 18:16:30

+0

我知道我可以使用WCF在流程之間來回拖曳對象,但這只是管道。我的問題是 - 使用什麼策略? 一個進程擁有所有對象還是它們在進程之間分配?當一個進程改變一個對象時,其他進程如何意識到這一點?他們是否拉動更新或被推?等等 – urig 2009-04-19 08:11:52

+0

「對象」確實意味着一些域對象?像客戶,產品等? 如果是這樣,我建議使用DTO(數據傳輸對象)來傳輸他們的數據。每個進程都有自己的「對象」副本。 你可以使用樂觀鎖定策略(在每個對象中都有特殊字段)來解決concurreny問題。 – Shrike 2009-04-19 11:36:36

1

您將需要決定您的兩個服務中的哪一個,或者還有三分之一的服務是您的域對象的權威來源。

由權威來源公開的遠程處理或基於WCF的一組服務應爲您的對象圖提供中心位置。不過,我認爲你正在爲你的對象簡單地創建一個分佈式緩存。

您是否考慮過Velocity Project

+0

確實,我確實考慮過使用(而不是實現)分佈式緩存來保存我的對象並共享它們。但是這些產品受限於它們不支持緩存對象之間的引用。 這是我前段時間發佈的一個相關的StackOverflow問題:http://stackoverflow.com/questions/701656/real-object-references-in-distributed-cache – urig 2009-04-19 08:09:36

1

在我們的項目中,我們使用ScaleOut StateServer(一種商業產品 - www.scaleoutsoftware.com)來實現整個服務器場中分佈式緩存/複製對象的類似用途。儘管使用對象確實會導致序列化成本,但這在很大程度上是非常有效的,所以在很多情況下,我們會簡化存儲的內容,以儘可能地串入字符串值。

我們還沒有完全評估Velocity項目,因爲我們的使用開始之前已經存在,我們沒有時間或有說服力的理由來考慮在這一點上的轉換,但這顯然需要一些調查,如果你只是現在開始。

編輯:我確實錯過了關於這個問題的重要部分 - 扁平對象引用。這可能是過度複雜的事情或者有其他缺點,但是如果採取更接近模擬分佈式緩存中的數據庫存儲的方法(保留它存儲每個不同對象實體的單個副本,並使用更寬鬆的引用來鏈接那些實體在一起)?

示例:您有一個'Group'類,它具有'Leader'屬性和'Members'集合,它們都包含作爲'Person'類實例的對象。你不得不使用自定義序列化來解決它,沒有什麼會奇蹟般地解決併發/髒更新問題,但是這個想法是,你放入分佈式緩存的實際上是所有個人的'Person'實例作爲「Group」實例本身的淺表副本。該淺拷貝將序列化正常的'Group'屬性(名稱等),以及包含在每個'Person'引用中的唯一標識符(如原始數據庫ID,GUID,唯一的用戶名或任何適用的),而不是Person對象自己。因此,您將擁有「領導者ID」而不是領導者,並且會員集合將序列化爲MemberID的列表。每個引用的人也存儲爲一個單獨的對象;這就是併發技巧發揮作用的地方。

反序列化時(或訪問,這取決於使用模式),本集團淺拷貝將遵循所有的人ID引用,並重新水合物與真人那些引用的對象分別存儲在分佈式緩存。你需要實現鎖定機制,以確保更新這些對象,這些對象可以在許多不同的組中共享,這是安全的。您還需要一個版本控制機制和一個「髒檢查」,以便重新讀取/接收對分佈式緩存中對Person對象所做的任何更改。

它似乎很複雜,但是這是最通用的方法不知道您的使用案例的具體情況,我能想到的。

+0

我實際上一直在使用相同的產品 - SOSS - 但就像所有其他分佈式緩存一樣,它可以「平整」對象圖形。在這裏看到我的StackOverflow問題:http://stackoverflow.com/questions/701656/real-object-references-in-distributed-cache – urig 2009-04-19 08:07:56