2012-02-26 38 views
4

我正在考慮MongoDB。這樣的目標是明確的這裏是需要發生的事情: 在我的應用程序,芬奇(finchformac.com的詳細信息)我每天有成千上萬的條目爲每個用戶打開窗口,打開它的時間,關閉它的時間,以及如果他們選擇一個標籤的標籤。我需要將這些數據在線備份,以便與其他Mac電腦同步。我還需要能夠從他們的數據在線繪製圖表,這意味着一些複雜的查詢會觸及數十萬條記錄。在Mac應用程序和Web之間同步一小段數據的最佳方式是什麼?

現在我已經嘗試使用Ruby/Rails/Mongoid與應用程序端的JSON解析器每次以10,000記錄的增量發送數據,數據被處理爲具有背景mapreduce作業的其他集合。但是,這一切都似乎阻止,最終太慢。 (如果有的話)有什麼建議可以解決這個問題?

+0

似乎在這種情況下,CouchDB可能會更好。 – 2012-02-27 07:26:22

+0

CouchDB會更好嗎? – Jameson 2012-02-29 04:43:18

+0

它設計用於斷開模式和偶爾同步。 – 2012-02-29 06:43:33

回答

1

你有一個複雜的問題,這意味着你需要把它分解成更小,更容易解決的問題。

問題(在我看來):

  1. 你已經有了它收集數據的應用程序。你只需要 將數據存儲在本地,直到它被同步到 服務器。
  2. 您已收到服務器上的數據,現在您需要將它快速推入數據庫中,以便其不會變慢。
  3. 你必須報告這些數據,這聽起來很難和複雜。

你可能想它寫成某種API的,爲了簡單起見(因爲你已經得到了在客戶端上的備用處理循環負載),你會想,這些數據塊處理在客戶端進入JSON準備導入數據庫。獲得JSON後,您不需要Mongoid(您只需將JSON直接引入數據庫)。此外,您可能不需要導軌,因爲您只是創建一個簡單的API,因此只需使用Rack或Sinatra(可能使用類似Grape的東西)。

現在你需要解決整個「這一切似乎阻止並最終太慢」的問題。我們已經刪除了Mongoid(所以不需要從JSON - > Ruby對象 - > JSON)和Rails轉換。在我們開始對這些數據做MapReduce之前,您需要確保它足夠快地加載到數據庫中。有機會你應該設計整個事情,以便你的MapReduce支持你的報告功能。對於數據同步,您不需要執行任何操作,只需傳遞JSON即可。如果你的數據沒有足夠快地寫入你的數據庫,你應該考慮Sharding your dataset。這可能會使用一些基於用戶的密鑰來完成,但您比我更瞭解您的數據模式。您需要選擇分片密鑰,以便在多個用戶同時同步時,他們可能會使用不同的服務器。

一旦你解決了問題1和2,你需要處理你的報告。 Mongo內部的MapReduce函數可能支持這個功能。我對這部分的第一個評論是確保你至少運行Mongo 2.0。 In that release 10gen sped up MapReduce(我的測試表明它比1.8快很多)。除此之外,您可以通過分片並將讀取指向副本服務器集中的輔助服務器(您正在使用副本服務器?)來實現進一步增加。如果這仍然不起作用,請考慮構建您的模式以支持您的報告功能。這使您可以在客戶端上使用更多週期來完成工作,而不是加載服務器。但是這種優化應該一直存在,直到你證明傳統方法無效。

我希望牆上的文字有所幫助。祝你好運!

+0

謝謝你的深思熟慮的迴應。我在客戶端機器上處理JSON的一個問題是,他們可以輕鬆修改它並在Mongo DB中編寫任何需要的東西。 – Jameson 2012-03-13 23:33:54

+0

這絕對是真的,雖然大概他們只會搗毀自己的數據,並會限制編輯任何其他人。 – 2012-03-14 00:17:31

相關問題