2011-01-22 84 views
3

您好我正在使用WCF創建一個API。我的問題可以分解爲兩個單獨的問題WCF最佳性能設置

1)我有很多電話,例如我有關於客戶,產品,訂單,僱員的電話。

我的問題是應這一切進入一個公共接口類如

public interface IRestService 
public class RestService : IRestService 

或者我應該有一個爲每個呼叫如

public interface ICustomer 
public class Customer : ICustomer 

public interface IProducts 
public class Products: IProducts 

2)如果你有一個API,這將是成千上萬的用戶和數以千計的用戶同時訪問您,您將如何設置,您的網絡配置設置在節流方面是什麼。另外你會給你的設置InstanceContextMode,或ConcurrencyMode。最後,它會是什麼類型的綁定,銘記網站和手機可以訪問api。

回答

1

良好做法的緣故,所以你讓他們分裂成在未來單獨實現的選項我會分手的API爲獨立的接口。你仍然可以只設一個服務類實現所有的接口,如:

public class RestService : ICustomer, IProducts, IOrders 

但是,它聽起來好像你可能想使他們分開的實現呢。

在併發設置方面,問問自己需要在每次調用中使用哪些資源。如果您的服務類的構造函數可以在沒有任何冗長啓動的情況下編寫,那麼使用PerCall。如果你需要初始化昂貴的資源,那麼我建議使用ConcurrencytMode.Multiple的InstanceContextMode.Single,並確保你編寫了線程安全的代碼。例如:確保在使用它們之前鎖定()任何類屬性或其他共享資源。

但是,數據庫連接將而不是算作「初始化昂貴」,因爲ADO會爲您執行連接池並消除該開銷。

您的調速設置將通過測試顯示,如Ladislav提到的。您需要對您的服務進行壓力測試並使用結果來了解您需要多少臺機器來維護您的預期負載。然後,您需要一個專用的負載平衡器來將請求路由爲循環,或者檢查每個服務器的健康狀況。負載平衡器可以設置爲獲取「systemhealth.asp」頁面並檢查結果。如果返回「OK」,那麼該機器停留在池中,或者如果超時或返回任何其他狀態,可以暫時從池中移除該池。

您的綁定需要WebHTTPBinding for REST。 BasicHTTPBinding用於SOAP接口,並且不支持[WebGet],例如。

如果它不一定是REST服務,那麼使用NetTcpBinding可以獲得更多性能。

+0

嗨,感謝您抽出時間回覆。我會在哪裏放置與接口相關的方法,他們會進入「RestService」類。例如,getCustomersByID是否會進入客戶類? – pmillio 2011-01-22 21:57:50

1
  1. 如果您確實有很少的操作,可以使用單一服務。一般而言,服務是相關操作的邏輯集合,但操作的數量應該是有限的。通常如果你的服務有超過20個操作,你應該考慮重構。

  2. 您打算使用REST服務嗎?我想你是因爲你的第一個界面的例子。在這種情況下,您需要WebHttpBinding(或類似的自定義綁定)與默認值InstanceContextModePerCall)和ConcurrencyModeSingle)值。 REST服務只有其他有意義的組合是InstanceContextMode.SingleConcurrencyMode.Multiple,但它會將您的服務創建爲可能影響您服務實施的單身服務。我的經驗法則:除非你真的需要它,否則不要使用單件服務。

  3. 調節配置取決於您的服務實現和服務器的性能。數千個併發用戶對你來說真的意味着什麼?同時處理數千個請求需要具有負載平衡器的良好服務器羣集或在Azure(雲)中託管。所有這些也取決於處理速度(操作實現)和消息大小。性能測試應該揭示MaxConcurrentInstancesMaxConcurrentCalls(應該與PerCall實例相同)的正確設置。 Default values服務限制在WCF 4已經改變