2012-06-05 47 views
3

我正在使用ASP .NET MVC 3編寫一個Web應用程序。我想使用MemoryCache對象,但我擔心它會導致負載平衡的Web服務器出現問題。當我谷歌它看起來像這個問題是在服務器上解決,即使用AppFabric。如果一家公司擁有負載均衡的服務器,那麼確保他們有AppFabric或類似的運行?還是有什麼我可以或應該做的這樣的開發人員?MemoryCache對象和負載平衡

回答

4

首先,對於ASP.NET,您應該查看ASP.NET Cache而不是MemoryCache。 MemoryCache是​​.NET 4.0中引入的通用緩存API,用於在非Web應用程序中提供等效的ASP.NET緩存。

你說的正確,可以說AppFabric解決了多個服務器擁有自己的緩存數據實例的問題,因爲它提供了一個可從所有Web服務器訪問的單個邏輯緩存。你就可以跨越作爲解決你的問題之前,有幾件事情要考慮:

  • 它不出貨與Windows Server的一部分 - 這是,如你所說,在 你安裝它在你的服務器上如果你想使用它。當 AppFabric發佈時,有人建議它將作爲 發佈到Windows Server的下一個版本的一部分,但我沒有看到 有關Windows Server 2012的任何確認情況。

  • 你需要額外的服務器,或者至少建議你有 他們。微軟對AppFabric的推薦是你在 專用服務器上運行它。這意味着雖然AppFabric本身是一個免費的 下載,您可能會承擔額外的Windows Server許可費用 。說到其中...

  • 您可能需要Enterprise Edition許可證。如果要使用AppFabric的高可用性功能,則只能使用運行Enterprise Edition的 服務器執行此操作,這是比標準版更昂貴的許可證 。

  • 畢竟你可能不需要它。其中一些將取決於您的應用程序以及爲什麼要使用共享緩存層。如果您擔心多臺服務器上的高速緩存可能與數據庫不同步(或實際上彼此),則可以使用SqlCacheDependency對象的某些明智使用方式,即可以解決您的問題。

+0

我在想使用緩存的是小附件。附件是要保存的較大對象的一部分。該對象在用戶單擊保存時保存。如果該對象尚未保存並且用戶上傳文件,則需要去某個地方。在大對象到達之前將數據放入數據庫中並不是正確的答案。當用戶在保存之前取消時,應用程序將不得不刪除該文件。 IMO高速緩存是存儲文件的正確位置,因爲可以以更高效的方式刪除該項目。這個邏輯是否有缺陷? –

1

此CodeProject文章Implementing Local MemoryCache Invalidation with Redis建議一種方法來處理您描述的情況。

您沒有提到您使用的負載平衡的風格:「粘滯」或「無狀態」。目前最簡單的解決方案是使用粘性會話。

如果您想使用本地內存緩存和無狀態負載平衡,則最終會出現競爭狀態,交叉服務器失效消息遲到。如果您使用ASP.Net MVC中常見的Post-Redirect-Get模式,這可能會特別成問題。這可以通過使用cookie來補充緩存失效廣播來克服。我在a blog post here中詳細說明了這一點。