J'ai énuméré ci-dessous quelques alternatives pour la gestion des connexions, par ordre de plus à moins recommandé.
Augmentez les connexions autorisées sur le serveur
La limite de connexion entrante totale sur le serveur est déterminée par la moindre des limites imposées par le système d'exploitation ou maxIncomingConnections
(alias maxConns
dans MongoDB 2.4 et versions antérieures).
Les distributions Linux limitent généralement les descripteurs de fichiers par processus à 1024, dont MongoDB utilisera 80% pour les connexions entrantes (laissant environ 819 connexions disponibles).
Vous pouvez vérifier les connexions actuelles et disponibles dans le mongo
shell via:
db.serverStatus().connections
Pour les systèmes de production, il est typique d'ajuster les ulimit
paramètres sous Linux pour permettre plus de connexions simultanées. Pour plus de meilleures pratiques, je recommanderais de revoir les notes de production dans le manuel MongoDB.
Fournir une API
Si vous gérez un serveur partagé avec des limites de ressources, il est courant de fournir votre propre API plutôt que d'accéder directement à la base de données. Cette approche vous offre une couche d'abstraction supplémentaire afin que vous puissiez gérer l'utilisation des ressources et le déploiement du serveur indépendamment de la configuration du client. Par exemple, vous pouvez déplacer votre serveur de base de données ou reconfigurer d'un poste autonome vers un jeu de réplicas, et les clients n'auront pas à en être conscients. Vous pouvez également gérer des limites de ressources personnalisées (telles que les connexions par client) via votre API, en fonction des informations d'identification que le client utilise pour se connecter.
Réduisez la taille du pool de connexions dans les clients
MongoDB (à la version 2.6) n'a pas d'option pour limiter les connexions par client. Normalement, les limites du client seraient imposées via le pilote (c'est-à-dire la définition de la taille du pool de connexions). Par exemple, dans le pilote Java, la MongoClient
taille maximale par défaut du pool est 100.
Vous avez déjà suggéré que ce n'était pas une option souhaitable car vous ne voulez pas que les clients gâchent les limites de connexion, mais si vous allez imposer une limite côté serveur, il serait toujours raisonnable de leur demander de définir la taille du pool. de manière appropriée. Sinon, leurs applications recevront des exceptions fréquentes lorsque vous couperez les connexions en excès.
Surveiller les opérations client
Si l'ajustement des limites sur le client ou le serveur n'est pas une option, une alternative à envisager consiste à implémenter un script pour compter les connexions clientes simultanées (par IP) via db.currentOp()
et tuer les connexions en excès via db.killOp()
. Vous devez être très prudent pour ne tuer que les demandes des clients. La killOp()
commande est une commande de superutilisateur qui vous permettra également de tuer les threads de base de données internes (ce qui peut conduire à des résultats imprévisibles).
REMARQUE: cette approche échouera si vos clients se connectent via une passerelle partagée (c'est-à-dire lorsque l'adresse IP source n'identifie pas de manière unique un client).