2010-07-23 77 views
0

我們正在研究分佈在3個負載平衡Web服務器上的Web應用程序。我們通過NHibernate獲取的大量數據存儲在System.Web.Caching.Cache中。當我使用3個Web服務器時,如何管理存儲在Web服務器上的緩存?

System.Web.Caching.Cache做了很多提高應用程序的響應能力,但也有一些問題,我們並不確切地知道如何解決,如

  1. 當用戶請求server1的數據數據緩存在server1上,但是對於下一個請求,負載平衡器可能會將它們指向server2。他們在server1上請求的數據不再可用,server2將不得不再次從數據庫請求它。

  2. 如果用戶在server1上執行某些操作以使緩存的數據無效,則會在server1上刷新緩存。但是server3的server2 &服務器仍然可以使用原始緩存,所以當用戶提交後續請求並將其導向其他服務器時,它們將顯示無效數據。

  3. 我們有定期更新數據(例如性能數據)的應用程序。性能數據更新時,我們希望從緩存中清除此數據,以便用戶再次請求數據時,會向他們顯示最新數據。我們如何讓這些應用程序清除3臺Web服務器上的緩存?

解決這些問題的最佳方法是什麼?

我們是否應該使用SessionState服務器將緩存存儲在單獨的服務器上,例如我們可以使用HttpContext.Session

有沒有辦法讓我們在其他2臺服務器上的緩存上設置Cache Dependency?

我們有可能在實際的數據庫表或行上實現緩存依賴關係嗎?當這些更改緩存刷新? - 或者我們可以設置一個數據庫觸發器來刷新緩存嗎?

回答

0

您有幾種選擇:

1)使用分佈式緩存(如distcache,速度,或NCACHE)

2)使用一個共享的緩存實例(類似memcached的,例如),其所有的網絡服務器都可以使用。

NHibernate有所有這些的二級緩存提供程序,可以找到here

2

是的,多服務器環境暴露了ASP.NET緩存的弱點,因爲它只是單服務器。您可能需要考慮使用像AppFabric這樣的分佈式緩存,這將爲您提供一個邏輯緩存,這是所有三個Web服務器的基礎。

AppFabric可以與NHibernate一起用作二級緩存 - 請參閱http://sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/(儘管請注意,this question表明當前實現可能不會與AppFabric v1版本保持同步)。