2011-10-08 53 views
2

首先,讓我說明情況,我有以下幾點:緩存(大和靜態)與類變量數據

「節點」類具有以下屬性:

  • NODE_ID(唯一)
  • NODE_NAME(唯一)

並與以下屬性 「NodeConnection」 級:

  • node_from
  • node_to

我們將有大約1〜3萬個節點和周圍的東西3 10萬個NodeConnections。

節點和連接導入一次後,它們不會更改

在對Rails應用程序的每個請求中,我們必須通過可能的node_names查找10到100個node_id。我們必須查找幾百到幾千個node_connections。我們目前的原型沒有任何緩存(所以,很多數據庫查詢)和響應時間是可怕的(如2分鐘)。 因此,我們通過memcached切換到高速緩存節點和連接。

雖然表現有所提升,但仍然缺乏表現。 (因爲我們爲每個NodeConnection調用Cache.read,每個請求有幾千個調用)

現在,我們嘗試通過Classvariable緩存,並獲得了巨大的性能提升。 (幾百毫秒內響應時間)

# Pseudocode below 
class Node 
    def nodes 
    @@nodes ||= get_nodes 
    end 
    def node_connections 
    @@node_connections ||= get_node_connections 
    end 
end 

所以,我想請教一下優點反對該方案的

缺點我有尚未:

  • 每個Rails的對象必須建立自己的高速緩存(它自己的ClassVariables) - >較高的總內存使用
  • 初始化緩存是耗時(1- 3分鐘),所以我們不能要求內做到這一點

任何其他解決方案在那裏緩存大(> 100MB)和靜態(數據應用生命週期中有效地不會改變)的數據,因此所有軌道同一臺機器內的實例可以非常快速地訪問此緩存(!)?

+0

只是一個想法,不知道它的好還是壞 - 是否嘗試過使用'Struct'而不是實際的類,或者使用自定義的C綁定?這也可以提高性能,我會看看 –

+0

。你可能有一些資源給C綁定的東西? – Deradon

+1

其他的上帝或壞主意:寫一個小的C應用程序,在本地UNIX套接字上提供數據,並緩存數據本身 –

回答

2

這聽起來像一個非常具體的情況,但爲了避免每個進程的內存緩存(即你的類變量)需要自然加熱,我會調查腳本的可行性溫暖啓動過程並從初始化程序中運行它...您的應用程序可能需要較長時間才能啓動,但您的用戶無需等待。

編輯|請注意,如果您正在使用諸如Unicorn之類的技術,該技術支持在派生工作進程之前預加載應用程序代碼,那麼可以將這種初始化的影響降至最低。

+0

感謝提示獨角獸。我會試一試。 (對獨角獸來說又多了一個機會:對於nginx和乘客有一些問題) – Deradon