2011-02-13 29 views
0

我正在ASP MVC3基於會員的web應用程序,我想提前計劃,我們的用戶羣一開始不會很大,但與任何軟件容量突然增加的可能性始終是可能的。我如何緩存私人數據在一個webfarm爲ASP MVC

考慮到這種情況,我知道數據庫是大多數Web應用程序的瓶頸區域。我們正在使用MSSQL 2008RS,我們將擁有專用服務器和多個客戶端數據庫,每個客戶端都有自己的數據庫,所以如果一臺服務器開始瓶頸,我們可以垂直擴展或將一些數據庫移動到新服務器並開始填充。

要訪問我們主要使用LINQ 2 SQL的數據庫,並且正在對我們的一些代碼進行重新分解,以利用IQueryable機制來執行內容的延遲加載。但每個頁面都包含來自數據庫各個部分的相當多的內容。

我們還有一些大型數據庫,用於程序中很少更改但具有數百萬行的小部件。這些目標是以某種方式將它們同步到主要來源,並將它們分佈到多臺機器上,然後負載平衡這些服務器。

有了這個佈局,我應該甚至擔心緩存問題,還是MSSQL中的內置緩存機制足夠了?

如果是這樣我應該從哪裏開始?我簡短地看了一下應用結構,但它看起來只適用於Azure?

資源:

How to cache data in a MVC application

http://stephenwalther.com/blog/archive/2008/08/28/asp-net-mvc-tip-39-use-the-velocity-distributed-cache.aspx

http://stephenwalther.com/blog/archive/2008/08/29/asp-net-mvc-tip-40-don-t-cache-pages-that-require-authentication.aspx

回答

2
  1. 延遲加載是一個性能殺手。使用一個連接加載整個對象圖表比延遲加載其他屬性更好。對象列表尤其如此。如果迭代,則最終會爲列表中的每個項目進行延遲加載。而且每次調用db都會有開銷。少通話=更好的表現。

  2. SO是一個前1000名的網站,它需要兩個數據庫服務器。我想你會沒事的。

  3. 如果您的收入模型顯示「每個客戶都有自己的數據庫」,那麼您的擴展問題應該很容易解決。聽起來你已經有了一個計劃,隨着客戶羣的增加,可以擴展更多的服務器。有什麼問題?

  4. Web層上的緩存通常是您不必擔心的第一個擴展修補程序。您可能不需要爲每個頁面請求執行新的數據庫調用。

總的來說,這聽起來像很多不成熟的優化。您的流量尚未達到您需要擔心縮放的問題。儘可能在最後一秒做出這些決定。

+0

我想我的意思是延遲加載,是Iqueryable將查詢堆疊在一起,直到我實際上抓取數據,然後它通過抓取數據的一大塊數據而對數據庫進行一次調用,在內存中處理它。 – AnonUser 2011-02-13 19:56:13

1

數據庫緩存與大多數緩存不同 - 如果課程將數據加載到內存並重新使用查詢計劃,它可以這樣做,但這不是真正的緩存。

AppFabric絕對不只是天青,畢竟,我是你無法在本地安裝(並使用它)的,但事實上AppFabroc,redis和memcached之間幾乎沒有什麼關係(當然,後者缺乏持久性)。

但我想你應該最初看看使用內置的asp.net緩存;通過HttpContext.Cache進行數據緩存以及緩存整個響應(或者在MVC 3中,部分)。很明顯,您應該對哪些數據被大量請求嚴重使用有一個廣泛的概念,並且可以重複使用:安全緩存!

只要確保將所有緩存的FAA視爲不可變(如果需要更新緩存,請重新添加修改後的值;不要修改現有對象) - 原因:如果您開始需要使用分佈式緩存,因爲它使用序列化,所做的任何更改都不會被下一個請求看到。