2010-05-23 22 views
6

我在asp.net應用程序中有很多Singleton實現,並且出於某些性能原因想要將我的應用程序移動到IIS Web Garden環境。IIS Web Garden中的單例對象

CMIIW,移動的IIS Web園與ň工作進程,會出現在每個工作進程中創建一個單獨的對象,這使得它不是一個單一的對象了,因爲ň> 1.

能我在IIS Web Garden中再創建所有這些單例對象,再單身?

回答

10

我不相信你可以(,除非你可以讓這些IIS工作者在共享內存中以某種方式使用對象)。

這是一個範圍問題。您的單例實例使用進程空間作爲其範圍。正如你所說,你的實現現在跨越了多個進程。 By definition,在大多數操作系統中,單身人員將被綁定到特定的進程空間,因爲它被綁定到單個類實例或對象

真的需要一個單身?在使用該模式之前,這是一個非常重要的問題。正如維基百科所說,有些人認爲它是一種反模式(或代碼味道等)。可工作包括替代設計的

實例...

  1. 可以有多個對象進行同步對中央存儲或彼此。
  2. 如果適用,請使用對象序列化。
  3. 使用Windows服務和某種形式的IPC,例如。 System.Runtime.Remoting.Channels.Ipc

我喜歡大型網站的選項3。伴隨的Windows服務通常對大型網站非常有用。諸如發送郵件,批量作業等很多事情應該已經與前端處理工作者進程分離了。您可以將單例服務器對象推送到該進程中,並在您的IIS輔助進程中使用客戶端對象。

如果您的單身人士課程與共享狀態的多個對象一起使用,或者剛分享初始狀態,則選項1和2應分別起作用。

編輯

從您的評論聽起來像一個分佈式緩存形式的第一個選項應該爲你工作。

這裏有很多分佈式緩存實現。

  1. 微軟AppFabric(以前叫做Velocity)是他們最近進入這個領域的。
  2. Memcached ASP.Net Provider
  3. NCacheMSDN Article) - 的OutProc支持自定義ASP.Net緩存提供商。應該有其他自定義的Cache提供程序。
  4. 鋪開自己的分佈式緩存使用Windows服務和IPC(選項3)

PS。因爲你正在專注於聊天。我肯定會推薦研究CometComet implementation for ASP.NET?WebSync等)

+0

它是一個非常複雜的聊天室,流量很大,但我們希望它儘可能的快速響應。我們不會將消息記錄到數據庫,所以我需要單身對象來將消息保存在內存中。 – 2010-06-05 11:20:40

+0

問題到選項1:如何在不同的進程中同步對象? – 2010-06-05 11:22:18

+0

選項3似乎很有前途的解決方案。將單身對象移動到IpcServerChannel(可能是一個控制檯應用程序),IpcClientChannel將代理該對象。你的意思是? – 2010-06-05 11:36:30