2017-03-06 52 views
0

我在NodeJS中創建了一個REST API,它連接到MongoDB並執行MapReduce並將結果存儲在不同的集合中。MongoDB + NodeJS:MapReduce或手動計算

代碼非常簡單。它需要一個用戶ID,以某種方式使用某種算法獲取與該用戶相關的所有其他用戶,然後爲每個用戶計算一個相似度百分比。假設測試數據庫中有5萬個用戶,這個MapReduce需要大約200-800ms。這對我來說很理想。如果這是出名的,並有這樣的數百個併發請求,我敢肯定,情況不會再這樣了。我知道MongoDB可能需要根據需要分割。

另一種情況是隻做普通的find(),遍歷遊標並執行相同的邏輯。它需要與MapReduce相同的時間。不過,我只是想過這一點,試圖在客戶端(NodeJS)而不是像MapReduce那樣在服務器端進行繁重的計算。這個想法是否有優點?我認爲這樣,我可以在負載平衡器後面水平擴展API。

回答

2

將處理每個請求並將其放到數據庫上的服務器重起來會更好。

如果您有1000個請求,並且其中200個請求您執行計算,那麼服務器可以像平常一樣處理800個請求,只要mongo使用mapReduce或聚合進行計算即可。

如果您改爲在節點服務器上手動運行計算,則所有請求都將受到服務器必須執行繁重工作的影響。

當然,Mongo在聚合方面也相當高效,我也會想象mapReduce。

我最近將大量的邏輯從我的服務器移到了mongoDB上,我可以在這裏創造一個與衆不同的世界。