Overview
Todos los controladores de MongoDB siguen un algoritmo definido al seleccionar un servidor desde el que leer o escribir. Al usar el server_selector propiedad de MongoClient, puede personalizar este algoritmo para elegir el servidor que funcione mejor para su aplicación.
Importante
Personalizar el algoritmo de selección de servidor puede tener consecuencias no deseadas, como un rendimiento de lectura o escritura degradado.
Algoritmo de selección personalizado
Cuando PyMongo ejecuta una operación de lectura, realiza los siguientes pasos, en orden, para seleccionar una implementación de MongoDB:
De la lista de servidores conocidos, PyMongo selecciona todos los servidores que coinciden con la preferencia de lectura activa.
Si existe al menos un servidor legible, PyMongo llama a la función de selección de servidor definida por el usuario y pasa la lista del paso anterior.
PyMongo aplica la configuración de conexión
localThresholdMSa la lista de servidores devueltos por la función.PyMongo selecciona un servidor al azar de los servidores que todavía están en la lista y ejecuta la operación contra este servidor.
Cuando PyMongo ejecuta una operación de escritura, comienza seleccionando todos los servidores con permisos de escritura, no solo aquellos que coinciden con la preferencia de lectura activa. Los pasos restantes son idénticos.
Para obtener más información sobre el algoritmo de selección de servidor predeterminado, que sigue el controlador cuando no utiliza el argumento server_selector, consulte
Algoritmo de selección de servidor en el manual del servidor MongoDB.
Ejemplo: Seleccionar servidores en localhost
Al usar un clúster fragmentado con varios servidores mongos, es posible que prefiera implementar implementaciones que se ejecuten en localhost. Las operaciones con estas implementaciones suelen tener menor latencia y mayor rendimiento. Este ejemplo muestra cómo personalizar el algoritmo de selección de servidores para priorizar los servidores que se ejecutan en localhost.
Primero, escriba una función de Python para seleccionar sus servidores preferidos. La función de selección de servidores debe cumplir los siguientes criterios:
Acepta una lista de
ServerDescriptionobjetos como parámetroDevuelve la lista de
ServerDescriptionobjetos adecuados para la operación de lectura o escrituraNo crea ni modifica ningún objeto
ServerDescription
El siguiente ejemplo define una función llamada prefer_local que acepta y devuelve una lista de ServerDescription objetos:
def prefer_local(server_descriptions): ... return servers # list containing preferred servers
A continuación, implemente la lógica de selección de servidores en el cuerpo de la función. Puede usar cualquier propiedad definida en la clase ServerDescription para seleccionar sus servidores preferidos. Para devolver solo las implementaciones de MongoDB que se ejecutan en localhost, este ejemplo recorre los servidores en server_descriptions y comprueba la propiedad address de cada servidor para el valor "localhost":
def prefer_local(server_descriptions): servers = [ server for server in server_descriptions if server.address[0] == "localhost" ] return servers
A continuación, considere el caso en el que su algoritmo no encuentra servidores coincidentes. Si su función devuelve una lista vacía, su aplicación no podrá comunicarse con MongoDB. Por lo tanto, devuelva una lista que contenga al menos un objeto ServerDescription de su función.
En este ejemplo, si no se encuentra ningún servidor coincidente, la función prefer_local devuelve la lista de servidores pasados originalmente como argumento:
def prefer_local(server_descriptions): servers = [ server for server in server_descriptions if server.address[0] == "localhost" ] if not servers: return server_descriptions return servers
Finalmente, indique a PyMongo que use su función. Para ello, llame al constructor MongoClient y pase el argumento server_selector con el nombre de su función como valor. Seleccione el Synchronous o pestaña Asynchronous para ver el código correspondiente:
client = pymongo.MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>", server_selector=prefer_local)
client = pymongo.AsyncMongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>", server_selector=prefer_local)
Documentación de la API
Para obtener más información sobre cómo personalizar el algoritmo de selección de servidor de PyMongo, consulte la siguiente documentación de API: