2010-12-23 27 views
0

我們目前有多個使用默認ServiceBehavior的WCF服務。由於可擴展性問題,我們正在考慮應用ConcurrencyMode = ConcurrencyMode.Multiple屬性來提高吞吐量。我們所有的服務電話是完全無狀態的,例如:ConcurrencyMode.Multiple in stateless WCF services

PersonService.cs:

public class PersonService : IPersonService 
{ 
    public GetPersonResponse GetPerson(GetPersonRequest request) 
    { 
    GetPersonResponse response = new GetPersonResponse(); 

    try 
    { 
     response.Person = Person.GetPerson(request.PersonID); 

     return response; 
    } 
    catch (Exception ex) 
    { 
     return (GetPersonResponse) response.SetException(ex); 
    } 
    } 
} 

Person.cs:

public static class Person 
{ 
    public static PersonDataContract GetPerson(int personID) 
    { 
    PersonDataContract pdc = null; 

    // load contract from db... 
    pdc = Database.Load<PersonDataContract>(personID); 

    // Address is another static class in the same pattern as Person 
    pdc.Addresses = Address.GetAddressesForPerson(personID); 

    return pdc; 
    } 
} 

Person類中的所有方法都是靜態的,以幫助性能,和無狀態的線程安全。 Database類也是靜態的,但其方法引用靜態變量。

在這種情況下,爲了使ConcurrencyMode.Multiple不會導致多線程問題,需要使線程安全嗎?我只想到Database類,但Person類(以及所有其他遵循相同模式的類)是否也需要鎖定?

我知道所有類應該是防彈的最大安全,但不幸的是時間限制不允許這...我們需要儘快獲得代碼。

回答

4

如果您使用默認的「每次調用」激活機制(如果您的服務完全無狀態,這很有效),添加ConcurrencyMode.Multiple絕對沒有意義,因爲每個傳入請求都將獲得自己的服務類實例來處理其要求。這是InstanceContextMode的首選和推薦設置。當您使用ConcurrencyMode.Multiple是當你有一個單身WCF服務中受益Discover Mighty Instance Management Techniques For Developing WCF Apps

唯一的一次 - 而這是非常氣餒,因爲它是一個)大:

瞭解更多關於WCF的實例管理在MSDN雜誌阻礙可擴展性,以及b)正確編程非常棘手。

我的建議是:儘量詳細縮小範圍什麼真的會導致性能問題。跳進ConcurrencyMode.Multiple似乎是錯誤的方法 - 這是非常混亂,非常勞動密集型,很多代碼,很多錯誤的機會......

+1

感謝marc - 我們設法說服客戶,這會給每個人帶來更多問題,經過進一步的討論發現他們實際上並不需要立即返回所有數據,只是認爲它會「有用」而不考慮其影響。我們現在返回的數據的一小部分已經使性能問題無效。 – 2011-01-12 07:08:53

0

如果你的服務是無狀態的並且線程安全,它是最好使用InstanceContextMode.Single與ConcurrencyMode.Multiple結合使用。

這將避免創建服務實例,減少內存佔用,降低GC活動。

幾乎每一個我發展服務這樣做....

,除非有需要保持每個呼叫或會話單獨的實例我就得到了他的去路。我不知道如何解決這個問題,但是這是非常令人沮喪的,因爲它是一個可擴展性的巨大障礙,以及b)非常難以正確編程。

它不是非常不鼓勵,對可伸縮性沒有影響(事實上可能是有益的),並且沒有任何關於它的棘手問題。