He enumerado algunas alternativas para la administración de la conexión a continuación, en orden de mayor a menor recomendada.
Aumentar las conexiones permitidas en el servidor
El límite total de conexión entrante en el servidor está determinado por el menor de los límites impuestos por el sistema operativo o maxIncomingConnections
(también conocido maxConns
en MongoDB 2.4 y anteriores).
Por lo general, las distribuciones de Linux limitan los descriptores de archivo por proceso a 1024, de los cuales MongoDB usará el 80% para las conexiones entrantes (dejando alrededor de 819 conexiones disponibles).
Puede verificar las conexiones actuales y disponibles en el mongo
shell a través de:
db.serverStatus().connections
Para los sistemas de producción, es típico ajustar la ulimit
configuración en Linux para permitir más conexiones concurrentes. Para obtener más prácticas recomendadas, recomendaría revisar las Notas de producción en el manual de MongoDB.
Proporcionar una API
Si está administrando un servidor compartido con límites de recursos, es común proporcionar su propia API en lugar de acceso directo a la base de datos. Este enfoque le brinda una capa adicional de abstracción para que pueda administrar el uso de recursos y la implementación del servidor independientemente de la configuración del cliente. Por ejemplo, podría mover su servidor de base de datos o reconfigurar de un conjunto independiente a un conjunto de réplica, y los clientes no tendrían que ser conscientes de esto. También puede administrar límites de recursos personalizados (como conexiones por cliente) a través de su API, en función de las credenciales que utiliza el cliente para conectarse.
Reduzca el tamaño del grupo de conexiones en los clientes
MongoDB (como en 2.6) no tiene una opción para limitar las conexiones por cliente. Normalmente, los límites del cliente se impondrían a través del controlador (es decir, establecer el tamaño del grupo de conexiones). Por ejemplo, en el controlador Java, el MongoClient
tamaño máximo predeterminado de la agrupación es 100.
Ya ha sugerido que esta no es una opción deseable, ya que no desea que los clientes jueguen con los límites de conexión, pero si va a imponer un límite del lado del servidor, aún sería razonable que establezcan el tamaño del grupo apropiadamente. De lo contrario, sus aplicaciones recibirán excepciones frecuentes a medida que elimine el exceso de conexiones.
Monitoree las operaciones del cliente
Si ajustar los límites en el cliente o servidor no es una opción, una alternativa a considerar es implementar un script para contar las conexiones concurrentes del cliente (por IP) db.currentOp()
y eliminar las conexiones en exceso db.killOp()
. Tendría que tener mucho cuidado para matar solo las solicitudes de los clientes. El killOp()
comando es un comando de superusuario que también le permitirá eliminar subprocesos internos de la base de datos (lo que puede conducir a resultados impredecibles).
NOTA: Este enfoque no tendrá éxito si sus clientes se están conectando a través de una puerta de enlace compartida (es decir, cuando la IP de origen no identifica de forma exclusiva a un cliente).