Di seguito ho elencato alcune alternative per la gestione delle connessioni, in ordine dal più al meno raccomandato.
Aumentare le connessioni consentite sul server
Il limite totale della connessione in entrata sul server è determinato dal minore dei limiti imposti dal sistema operativo o maxIncomingConnections
(ovvero maxConns
in MongoDB 2.4 e precedenti).
In genere le distribuzioni Linux limitano i descrittori di file per processo a 1024, di cui MongoDB utilizzerà l'80% per le connessioni in entrata (lasciando circa 819 connessioni disponibili).
È possibile verificare le connessioni correnti e disponibili nella mongo
shell tramite:
db.serverStatus().connections
Per i sistemi di produzione è tipico regolare le ulimit
impostazioni su Linux per consentire più connessioni simultanee. Per ulteriori best practice, consiglierei di rivedere le note di produzione nel manuale MongoDB.
Fornire un'API
Se gestisci un server condiviso con limiti di risorse, è comune fornire la tua API anziché l'accesso diretto al database. Questo approccio offre un ulteriore livello di astrazione in modo da poter gestire l'utilizzo delle risorse e la distribuzione del server indipendentemente dalla configurazione del client. Ad esempio, è possibile spostare il server di database o riconfigurare da un set autonomo a un set di repliche e i client non dovrebbero esserne consapevoli. Puoi anche gestire limiti di risorse personalizzati (come connessioni per client) tramite la tua API, in base alle credenziali utilizzate dal client per connettersi.
Ridurre le dimensioni del pool di connessioni nei client
MongoDB (al 2.6) non ha un'opzione per limitare le connessioni per client. Normalmente i limiti del client verrebbero imposti tramite il driver (ovvero impostando la dimensione del pool di connessioni). Ad esempio, nel driver Java la MongoClient
dimensione massima del pool predefinita è 100.
Hai già suggerito che questa non è un'opzione desiderabile in quanto non desideri che i client interferiscano con i limiti di connessione, ma se imponi un limite lato server sarebbe comunque ragionevole impostarli per impostare la dimensione del pool appropriatamente. Altrimenti le loro applicazioni avranno frequenti eccezioni quando si eliminano le connessioni in eccesso.
Monitorare le operazioni del client
Se la regolazione dei limiti sul client o sul server non è un'opzione, un'alternativa da considerare è l'implementazione di uno script per contare le connessioni client simultanee (tramite IP) tramite db.currentOp()
e eliminare le connessioni in eccesso tramite db.killOp()
. Dovresti stare molto attento a uccidere solo le richieste dei clienti. Il killOp()
comando è un comando superutente che ti permetterà di uccidere anche i thread del database interno (il che può portare a risultati imprevedibili).
NOTA: questo approccio non avrà esito positivo se i client si connettono tramite un gateway condiviso (ovvero dove l'IP di origine non identifica in modo univoco un client).