2015-05-22 23 views
0

我覺得這個問題以前會被問到,但是我找不到。如果這是重複,請原諒我。檢查MongoDB的排隊讀寫

我在使用Heroku託管的Node.js上構建一個服務,並使用Compose託管的MongoDB。在負載較重的情況下,延遲最可能來自數據庫,因爲服務層中沒有任何CPU佔用太多。因此,當MongoDB超載時,我想立即返回一個HTTP 503而不是等待超時。

我也在使用REDIS,REDIS有一個功能,可以檢查排隊命令的數量(redisClient.command_queue.length)。有了這個功能,我可以立即知道REDIS是否備份。 MongoDB有類似的東西嗎?

我發現迄今爲止最好的選擇是通過this command輪詢服務器的狀態,但(1)我希望有一些客戶端,因爲在輪詢間隔內可能出現尖峯導致問題,(2) )我並不確定我想要採取什麼行動。第二部分帶給我一個後續問題...

我不完全瞭解MondoDB客戶端如何與服務器一起工作。每個客戶端實例共享一個連接(在我的情況下,每個進程)?查詢和寫入是否在本地或服務器上排隊?或者,是否爲每個查詢/寫入打開了一個連接,直到數據庫連接池耗盡?如果後者是這種情況,那麼我似乎可能要密切關注開放的聯繫。除了在查詢狀態時,MongoDB服務器是否在其他時間返回這些信息?

謝謝!

回答

1

MongoDB的連接池的工作流 -

每個MongoClient實例有一個內置的連接池。客戶端按需打開套接字以支持應用程序需要的併發MongoDB操作數。套接字沒有線程相關性。

客戶端實例爲MongoDB拓撲中的每臺服務器打開一個額外的套接字,用於監視服務器的狀態。

每個連接池的大小在maxPoolSize,默認爲100

當你的應用程序線程開始對MongoDB的操作上限,如果所有其他的插座都在使用中和池已達到其最大,線程暫停,等待一個套接字被另一個線程返回到池中。

可以增加maxPoolSize

client = MongoClient(host, port, maxPoolSize=200) 

默認情況下,任意數量的線程允許等待套接字變爲可用,他們可以等待的時間長短。重寫waitQueueMultiple以限制等待線程的數量。例如。,對服務員小於或等於的數目保持在500:

client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10) 

一旦池達到其最大大小,額外的線程被允許無限期地等待套接字變爲可用,除非你設置waitQueueTimeoutMS

client = MongoClient(host, port, waitQueueTimeoutMS=100) 

參考連接pooling- http://blog.mongolab.com/2013/11/deep-dive-into-connection-pooling/

+0

這僅僅是那種我一直在尋找的信息。非常感謝! –