2009-12-03 168 views
1

在應用程序代碼中緩存數據通常是一個好主意,原因很多。我們一直在包括ColdFusion,.NET和PHP在內的共享環境中安靜地執行此操作。但是,由於我們與組織中的許多其他開發組共享此環境,因此我們(或我們的客戶)欣賞的停機時間明顯更多。在集羣環境中緩存

因此,我們的網站管理員正在轉向實施新的環境。在這種環境下,他們在當前的Dev和Prod環境之間添加QA級別。另外,爲了增加正常運行時間,它們都是QA和Prod級別的集羣機器。

這一切都很好,原因很多。我發現問題的一個領域是緩存。將有兩個(或更多,取決於節點數量)緩存集。正如你可以想象的那樣,這會產生以下潛在問題。緩存在節點A和B上是相同的。用戶1更新數據,從而在節點A上更新緩存。用戶2來查詢數據但在節點B上,因此得到舊數據。

他們有關如何處理這個問題的最佳實踐?

在我的代碼中可以進行任何類型的更改嗎?

是否有可以實施的服務器設置?

回答

2

內容緩存的基本兩種方法是1)集中和2)複製。

每個都可以以各種方式實現,並且可以實現各種複雜程度。

如果你只是談論一小組Web服務器,那麼簡單的集中設置就是你想要的。我會推薦一個memcached服務器每個環境(其中PHP supports)。因此,在您的模型中,節點A和節點B都將使用來自新節點的緩存數據:節點C.

複製是更具可擴展性的解決方案,但它的實現也顯着更復雜。但你需要達到這個路線(想臉書,youtube,wikipedia)浩大的流量,所以我懷疑你需要擔心它。

2

將ColdFusion Multiserver配置與羣集化ColdFusion實例一起使用時,可以在羣集中使用會話複製,但謹慎使用它,因爲緩存數據會不斷序列化並編組到羣集中的其他服務器。您可以序列化複雜數據(CFWDDX)並將其存儲在數據庫中,然後將主鍵存儲在會話範圍中以複製到哪裏找到記錄,並且可能會有一個標誌指示緩存的數據已更改,這會導致其他服務器從數據庫刷新它們的緩存。

+0

緩存的要點是,我們不必對數據庫進行不必要的調用。因此,我不認爲在這種情況下使用CFWDDX和數據庫存儲會很好。 – Jason 2009-12-03 16:19:54

+0

只要你不需要共享ColdFusion以外的緩存數據(對.net或php等),那麼我認爲Steven建議使用ColdFusion的內置集羣是你最好的選擇。它的烘烤和完全支持 - 你還能要求什麼? – 2009-12-03 16:32:55

+0

我正在尋找適用於不同語言的解決方案。這*可能解決我們在coldfusion中的問題,但不能解決其他地區的問題。 – Jason 2009-12-03 16:45:40

0

用於存儲數據庫存儲的複雜數據的要點在於,它是上述Peter建議的集中化方法。服務器將複製引用數據的密鑰,並標記指示是否已更改。然後,在更改時,其他服務器將查詢修改後的數據並緩存它,直到再次設置更改標誌。每個服務器只會在每次更改時查詢數據庫一次,並且數據是集中的,而不是隻保留在內存中。

如果數據不那麼複雜,那麼會話複製可以完成您想要的任務,而不涉及數據庫。性能與羣集中的服務器數量成反比(因爲複製量將以指數形式增長,因爲它們都將數據複製到其他成員)以及要複製的數據量。

0

有一個Java memcached客戶端的cf實現,它允許您使用memcached輕鬆地直接從coldfusion進行緩存。

http://memcached.riaforge.org/

我會做一個非常強大的投贊成票的memcached的,即使你有到Web服務器的同一個集羣上運行它,你會得到一個緩存位置的數據元素的利益,和冗餘的集羣。

1

如果您正在運行ColdFusion 9,則可以使用新的內置高速緩存來實現ehcache。在集羣環境中,設置使用RMI的複製集羣高速緩存非常簡單(只需幾行XML)。查看緩存我一系列的ColdFusion 9瀏覽:

http://www.brooks-bilson.com/blogs/rob/index.cfm/Caching

上建立一個集羣高速緩存後尚未完成,但如果你直接與我聯繫,我可以提供你所需要的配置您的ehcache.xml文件以及更具體的說明。