2012-08-30 237 views
3

想象有一個Web服務:服務器集羣上自定義內存緩存

  • 奔跑(nginx的/ node.js中)
  • 所有數據遠程存儲
  • 必須在20毫秒
  • 迴應

數據必須被讀的響應被分割這樣..

BatchA

  • 數以百萬計的小物件存放在AWS DynamoDB
  • 在隨機時間
  • 只有持續讀隨機更新,不能被逮住

BatchB

  • 〜2,000條SQL中的記錄
  • 很少更新,記錄高達1KB
  • 可以釣到長達60-90s

我們無法讀取它們一次全部,因爲我們不知道哪些記錄,直到我們看到從BatchB取來自BatchA。

從DynamoDB讀取最多需要10ms。如果我們從遠程位置讀取BatchB,它將使我們沒有時間進行計算,或者我們已經超時。

我目前的想法是將所有BatchB記錄加載到每個節點的內存中(這只是〜2MB)。啓動時,系統將連接到SQL服務器並獲取所有記錄,然後每60或90秒更新一次。問題是這樣做的最好方法是什麼

我可以簡單地將它們全部讀入node.js中的變量(數組)中,然後使用SetTimeout在60-90s之後更新數組。但是最好的解決方案

+0

我建議看看Couchbase服務器。它在一個產品中提供緩存和數據持久性,並被許多需要高性能和低延遲響應的公司使用。 – mikewied

+0

感謝您的回覆,但我無法使用另一個遠程數據存儲。如果是這種情況,我可以使用相同的DynamoDB。這些數據應該在每個節點的RAM中。 – sPaul

回答

0

您的解決方案聽起來不太好。它符合你的需求。去吧。

我建議在從遠程位置進行更新的過程中保留緩存的兩個副本。在收到2MB數據時,您已經獲得了部分數據副本。我會堅持舊的緩存,直到新的數據被完全接收。

另一種方法是隻維護一個緩存集並在每個記錄到達時更新它。但是,這更難以實施,並且容易出錯。 (例如,如果不再在遠程位置找到這些記錄,則不應該忘記從緩存中刪除記錄)。這種方法可以節省內存,但我不認爲2MB是一件大事。