2012-03-22 71 views
0

我有一個昂貴的服務器端資源(這是線程安全的)。我想提供的是:編寫基於.NET的REST服務 - 使用線程池和Singleton

  • 遠程REST接口,而其他應用可以提交數據,並把它加工

從非功能性的角度來看:

  • 我想貴服務器端對象爲Singleton,即單個實例將服務所有請求
  • 我想限制正在招待的請求的數量 - 如果有更多的請求,那麼允許的池,休息應該wai t在隊列中進行處理。

我可以編寫自定義代碼來完成上述說明,但我不想這樣做。自從我使用WCF以來,我已經有一段時間了 - 任何人都可以指導我設計架構?

問候。

供參考:由於許可限制,我真的不能創建多個對象實例。

回答

1

爲什麼不使用Object Pool模式來控制昂貴的服務器端對象的生命週期?

Singleton對請求數量施加限制聽起來有風險。遲早它會報復你,因爲客戶的數量會增加,你的服務將是低效的。另外,Singleton在併發環境中是有風險的,如果Singleton有它自己的狀態,兩個或多個併發請求將會破壞它。

另一方面,您將完全控制游泳池,創建多少昂貴的對象以及何時創建。是的,你需要一個自定義代碼。

如果您仍然需要開箱即用,您可以使用ServiceBehavior屬性來控制您的服務。 InstanceContextModeConcurrencyMode屬性可能會按照您的預期工作 - 允許您設置單例模式並對傳入請求進行排隊(InstanceContextMode.SingleConcurrencyMode.Single)。

+0

謝謝,但我有以下限制:a)由於許可+技術限制,我實際上無法創建多於一個實例; b)單身物體沒有任何狀態。 – effkay 2012-03-22 09:05:32

+0

然後你可以按照'ServiceBehavior'建議。 – 2012-03-22 09:11:38

+0

問題:ConcurrencyMode.Single在任何給定的時間只會讓一個請求被娛樂 - 有沒有一種方法可以指定一個池大小?比如說,最多10個電話應該在任何給定的時間進行娛樂?是否可能在代碼級別或我需要配置IIS? – effkay 2012-03-22 09:46:41