你有一個複雜的問題,這意味着你需要把它分解成更小,更容易解決的問題。
問題(在我看來):
- 你已經有了它收集數據的應用程序。你只需要 將數據存儲在本地,直到它被同步到 服務器。
- 您已收到服務器上的數據,現在您需要將它快速推入數據庫中,以便其不會變慢。
- 你必須報告這些數據,這聽起來很難和複雜。
你可能想它寫成某種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快很多)。除此之外,您可以通過分片並將讀取指向副本服務器集中的輔助服務器(您正在使用副本服務器?)來實現進一步增加。如果這仍然不起作用,請考慮構建您的模式以支持您的報告功能。這使您可以在客戶端上使用更多週期來完成工作,而不是加載服務器。但是這種優化應該一直存在,直到你證明傳統方法無效。
我希望牆上的文字有所幫助。祝你好運!
似乎在這種情況下,CouchDB可能會更好。 – 2012-02-27 07:26:22
CouchDB會更好嗎? – Jameson 2012-02-29 04:43:18
它設計用於斷開模式和偶爾同步。 – 2012-02-29 06:43:33