2009-09-04 73 views
0

我在負載均衡服務器上創建了WCF服務(Windows服務上的主機)。每個此服務實例維護當前用戶的列表。例如。實例A具有用戶A001,A002,A005,實例B具有用戶A003,A004,A008等。在.NET應用程序實例之間共享數據的最佳方式?

在每個服務都有用來獲取用戶列表的接口,我期望這個方法返回所有服務實例中的所有用戶。例如。從實例A獲得用戶列表或者實例B將返回A001,A002,A003,A004,A005和A008。

目前我認爲我會將當前用戶的列表存儲在數據庫上,但這個列表似乎經常更新。

我想知道,它有另一種方式來共享適合我的情況的WCF服務之間的數據?

+0

試試這個答案:http://stackoverflow.com/questions/617256/best-way-to-share-session-state-type-data-between-two-net-applications – 2009-09-04 02:16:08

回答

1

數據庫似乎提供了一個永久性存儲,對您的應用程序可能有用或重要。另外它支持對你有用的交易等。很多更新可能是一個性能問題,但它取決於確切的數字,查詢模式是什麼,使用的數據庫引擎,本地化等。

此選項的替代可能是某種內存緩存服務器memcached的。雖然這可以與數據庫服務器以類似(某種)方式共享和訪問,但有一些注意事項。首先,這些平臺通常不受某種永久存儲的支持。當memcached服務器死亡時會發生什麼?其次,它們可能不符合ACID標準供您使用。在加載和更新方面會發生什麼?

0

DB選項聽起來不錯。如果沒有性能問題,這是一個簡單的設計應該工作。如果你能負擔得起半實時的,並且非永久性的一種方法是維護每個服務的內存中的列表,然後每個服務在新用戶加入時更新另一個服務。這可以通過中央服務或使用msmq等進行某種廣播。

2

就個人而言,數據庫選項聽起來像是矯枉過正,只是基於存儲當前用戶的概念。如果你實際存儲的不止這些,那麼使用數據庫可能是有道理的。但是,假設您只是想從WCF服務的兩個實例中獲取當前用戶的列表,我會使用內存中的解決方案,就像是一個靜態的通用字典。只要服務可以唯一標識,我就會使用唯一的服務ID作爲字典中的關鍵字,並將每個關鍵字與該服務的用戶名稱(或某些適當的用戶數據結構)的通用列表配對。例如:

private static Dictionary<Guid, List<string>> _currentUsers; 

由於此字典將在兩個WCF服務之間共享,因此您需要同步對它的訪問。這是一個例子。

public class MyWCFService : IMyWCFService 
{ 
    private static Dictionary<Guid, List<string>> _currentUsers = 
     new Dictionary<Guid, List<string>>(); 

    private void AddUser(Guid serviceID, string userName) 
    { 
     // Synchronize access to the collection via the SyncRoot property. 
     lock (((ICollection)_currentUsers).SyncRoot) 
     { 
      // Check if the service's ID has already been added. 
      if (!_currentUsers.ContainsKey(serviceID)) 
      { 
       _currentUsers[serviceID] = new List<string>(); 
      } 
      // Make sure to only store the user name once for each service. 
      if (!_currentUsers[serviceID].Contains(userName)) 
      { 
       _currentUsers[serviceID].Add(userName); 
      } 
     } 
    } 

    private void RemoveUser(Guid serviceID, string userName) 
    { 
     // Synchronize access to the collection via the SyncRoot property. 
     lock (((ICollection)_currentUsers).SyncRoot) 
     { 
      // Check if the service's ID has already been added. 
      if (_currentUsers.ContainsKey(serviceID)) 
      { 
       // See if the user name exists. 
       if (_currentUsers[serviceID].Contains(userName)) 
       { 
        _currentUsers[serviceID].Remove(userName); 
       } 
      } 
     } 
    } 
} 

既然你不想特定服務列出兩次的用戶,它很可能是有意義與HashSet<string>更換List<string>

+0

如何在服務之間同步這些數據? – Anonymous 2009-09-04 06:05:49

0

如果您重新考慮並使用IIS主機,您會發現在配置文件中使用單行可以使ASP Global,Application和Session對象可用。這個技巧也非常方便,因爲這意味着你可以在ASP應用程序和WCF服務之間共享會話狀態。

1

我喜歡記憶的方式。其實我正在爲我現在工作的項目設計一個相同的機制。這對於沒有機會訪問數據庫的場景很有用,或者有些人真的不願意創建一個表來存儲簡單信息,如用戶列表中的機器名稱。

只有更新我會在那裏做一個節點將只返回其可用用戶列表到其對端,同行將結合它的現有列表。然後將其現有列表返回給調用的同伴。這就是所有的同齡人如何與同一個名單同步。

相關問題