2013-10-07 53 views
1

我使用與像複製或分片沒有特殊的拓撲結構的單個獨立蒙戈DB服務器等。目前我有蒙戈DB不支持超過500所並行請求的問題。請注意,我只使用MongoClient的一個實例,其餘線程用於插入。我正在使用java executor框架來創建線程,並且這些線程用於將數據插入集合[所有插入同一個集合中]如何將多個請求並行化爲mongoDb?

回答

1

在向數據庫發出請求之前,您應該排隊這些請求。並行請求數據庫中的500件事是沒有用的。記住一個請求帶有一些明智的內存成本,明智的鎖定等等。實際上,你通過一次詢問你的數據庫浪費資源 - 記住我的意思是這個請求明智而不是數據明智的。

因此,使用一個隊列(或更多)併合並請求。從那個池中,你餵給你的工作線程(可以說5或10就足夠了)就是這樣。

看看java併發包中的Future接口。在這裏使用異步處理看起來像是吞吐量最高,資源影響最小的東西。

但首先檢查MongoDB驅動程序。如果他們已經以這種方式實施它,我不會感到驚訝。如果是這種情況,你只需通過使用一個隊列來限制你自己,讓一次只能由數據庫驅動程序處理10或100個請求。做一些性能檢查,調整發送到數據庫的實際請求的數量。

+0

假設我送並行請求READ,應該在這種情況下,沒有鎖。並行READ請求的開銷是多少? – hershey92

+0

MongoDB將每種請求內存的開銷都附加在明智之列。根據你的選擇,有時候mongodb會同時打開多個文檔並行處理並推遲其他事情。 做一些基準測試。如果你在小文檔上做一些廉價的請求,那麼佔用的空間並不多,但是做搜索或讀取子樹可能代價很高。 –

+0

和MongoDB傾向於做更多的事情的同時,你有CPUcores讓你產生額外的請求並沒有真正加快的東西,但由成本addional內存降低整體responstime(確定不是很多,但做一些基準測試,以確保)。 –

相關問題