2012-02-06 37 views
2

僅供參考 - 我是一個新成員,相當新的程序員,這是我在stackoverflow上的第一篇文章。如何緩存多個節點的可擴展性

對於我的Web應用程序,我一直在編寫自己的數據緩存層;在這樣做時,應用程序已被設置爲僅當在緩存中未找到時才從數據庫獲取數據。隨着時間的推移,應用程序會從緩存中刪除陳舊的數據,以儘量減少RAM中保存的數據量。如果我的web應用駐留在單個服務器上,這對我來說很有效,可以限制對數據庫服務器發出的只讀請求的數量。現在我正在考慮通過多個節點對我的web應用程序進行負載均衡,並且希望保持緩存實現的原樣。我試圖解決的問題是如何保持不同的webapp節點緩存層同步。

問題方案可能是一個典型的一個:

  1. 人A讀取的節點#1記錄#1#版本1;緩存在節點#1上更新。
  2. 人員B讀取節點#2上記錄#1的版本#1;緩存在節點#2上更新。
  3. 人A更新節點#1上的記錄#1;
    • 數據不在數據庫中讀取,因爲它在緩存中。
    • 緩存更新爲記錄#1的版本#2。
    • 版本2的數據寫入被髮送到數據庫。
  4. 人B在節點#2上讀取記錄#1;
    • 數據不從數據庫中讀取,因爲數據在高速緩存中導致版本#1,現在已過期。

因此,有浮現在腦海中的一些想法。

  1. 我可以放棄緩存,每次讀寫都來自db(顯然不適合我)。
  2. 我可以實現某種形式的一致哈希。即我可以將所有記錄#1項目發送到節點#1。但是,我發現需要在每個節點上共享數據,例如用戶配置文件數據(即,當更新記錄#1時,用戶配置文件也需要更新,所以需要進入其他節點的緩存以及讓我對配置文件記錄有同樣的問題)。
  3. 我可以使用一致的哈希記錄,並以某種方式拆分出用戶數據,使數據層不被緩存(仍然不理想)。
  4. 我可以學習erlang並開始在緩存層之間發送消息,但是我在erlang上試過我從未真正花過的時間(可能是理想的技術解決方案,但我寧願不學習erlang-lol)。

所以這是我第一次給出這個想法。任何像我這樣的隱士般的愛好程序員都應該知道的衆所周知的策略?想法,解決方案?

備註: - 我的主要語言是Clojure,雖然這不一定與手邊的問題有關。 - 我已經在使用NoSQL dbs。

謝謝。

回答

0

如果你在實現自己的緩存解決方案很感興趣,並希望保持節點同步,可能比你希望將一些外部緩存失效接口添加到您的系統。

例如,如果您的NoSQL數據庫支持更新後的掛鉤,它可以向所有節點發出多播UDP命令,該節點的某些值不再有效。另外,您可以使用某種消息隊列的這個(如ActiveMQRabbitMQ),但是這很可能是矯枉過正。

由於Clojure是一個基於JVM的語言你可以使用一些現有的JVM的緩存解決方案,像Ehcache。如果不實現教育目的這個緩存系統,這樣可以爲您節省大量的時間和精力。

順便說學習Erlang是有趣和有益的經驗一個偉大的組合。我永遠不會後悔,我花了我的一部分生活習慣。它也將最終在你的案例中得到回報。