2009-11-19 72 views
4

我正在構建一個應用程序,該應用程序包含一個功能,以交互方式或多或少地批量標記數百萬條記錄。用戶交互與Gmail非常相似,用戶可以在其中標記單個電子郵件或批量標記大量電子郵件。我也需要對這些標籤成員的快速讀取權限,以及讀取模式或多或少是隨機的。用於低延遲讀取和寫入的持久性策略

現在我們使用Mysql併爲每個標記 - 文檔對插入一行。向Mysql寫入數百萬行需要一段時間(高I/O),即使是批量插入和大量優化。我們需要這是一個交互式過程,而不是一個批處理過程。

對於我們正在存儲和讀取的數據,數據的一致性和可用性不如性能和可伸縮性那麼重要。因此,如果系統在寫入過程中發生故障,我可以處理一些數據丟失。但是,在某些時候,數據肯定需要保存到輔助存儲中。

所以,總結一下,這裏有要求:

  • 數據需要以某種方式
  • 低時延隨機讀取要堅持

    • 的數以百萬計的記錄可能幾十低延遲批量寫入不需要
    • 耐用寫入
    • 最終一致性是好的

    這裏有一些解決方案,我已經看了:其中的記錄寫入到內存,瀝乾到數據庫異步高速緩存(兵馬俑,GigaSpaces的,連貫性)的後面

    • 寫。這些讓我感到害怕,因爲它們似乎給我想要避免的應用程序增加了一定的複雜性。
    • 高度可擴展的鍵值存儲,如MongoDB的,HBase的,東京暴君
  • 回答

    2

    如果您有爲此使用Coherence的預算,我強烈建議您這樣做。在Coherence中直接支持後寫式最終一致性行爲,並且對於數據庫中斷和Coherence集羣節點中斷(如果在單獨的JVM上使用> = 3個Coherence節點,最好在單獨的主機上),它是非常有生命力的。我已經爲一家財富100強公司的電子商務網站實施了大批量CRM,並且非常有效。

    此體系結構最好的方面之一是您可以編寫您的Java應用程序代碼,就好像沒有發生任何寫後行爲一樣,然後插入使其發生的Coherence拓撲和配置。如果以後需要更改Coherence的行爲或拓撲,則不需要更改應用程序。我知道可能有一些合理的方法可以做到這一點,但這種行爲在Coherence中直接支持,而不必發明或手動實現。

    爲了實現一個非常好的觀點 - 您擔心增加應用程序複雜性是一個很好的選擇。使用Coherence,您只需將更新寫入緩存(或者如果您使用Hibernate,則它可以是L2緩存提供程序)。根據您的Coherence配置和拓撲結構,您可以選擇將應用程序部署爲使用後寫式,分佈式和緩存。因此,由於緩存的特性,您的應用程序不會更復雜(並且坦率地不知道)。

    最後,我在2005-2007年實施了上述解決方案,當時由Tangosol完成Coherence,他們得到了最好的支持。我不確定Oracle現在的情況如何,希望還是很好的。

    0

    根據如何您的數據也許是組織你將能夠使用sharding, 如果讀取延遲是不是足夠低的你也可以嘗試添加緩存。 Memcache是​​一種流行的解決方案。

    1

    我曾在一個大型項目中使用asyncrhonous寫althoguh在那種情況下,它只是手寫使用後臺線程。您也可以通過將db寫入過程卸載到JMS隊列來實現類似的功能。

    有一件事肯定會加快數據庫寫入是批量執行它們。 JDBC批量更新的速度可能比單個寫入快幾個數量級,如果您正在異步執行它們,則可以一次寫入500個。

    0

    Berkeley DB具有非常高性能的基於磁盤的哈希表,支持事務處理,並且在需要時集成Java EE環境。如果您能夠將數據建模爲鍵/值對,那麼這可能是一個非常可擴展的解決方案。

    http://www.oracle.com/technology/products/berkeley-db/je/index.html

    (注:甲骨文收購Berkeley DB的約5-10年前,原來的產品已經有15 - 20年)。