Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Personalizar selección de servidor

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 del servidor puede tener consecuencias no intencionadas, como un rendimiento de lectura o escritura degradado.

Cuando PyMongo ejecuta una operación de lectura, realiza los siguientes pasos, en orden, para seleccionar una implementación de MongoDB:

  1. De la lista de servidores conocidos, PyMongo selecciona todos los servidores que coinciden con la preferencia de lectura activa.

  2. Si existe al menos un servidor legible, PyMongo llama a la función del selector de servidor definida por el usuario y pasa la lista del paso anterior.

  3. PyMongo aplica la configuración de conexión localThresholdMS a la lista de servidores devueltos por la función.

  4. 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 en los que se puede escribir, no solo aquellos que cumplen 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 MongoDB Server.

Cuando usas un clúster particionado con múltiples servidores mongos, podrías preferir implementaciones que se ejecuten en localhost. Las operaciones contra estas implementaciones suelen tener menor latencia y mayor rendimiento. Este ejemplo muestra cómo personalizar el algoritmo de selección de servidor para favorecer 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 objetos ServerDescription como parámetro

  • Devuelve la lista de objetos ServerDescription adecuados para la operación de lectura o escritura

  • No 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, implementa tu lógica de selección de servidores en el cuerpo de la función. Puede utilizar cualquier propiedad definida en la clase ServerDescription para seleccionar sus servidores preferidos. Para devolver sólo 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

Por último, instruye a PyMongo para que utilice tu función. Para hacerlo, llame al MongoClient constructor y pase el argumento server_selector con el nombre de su función como valor. Selecciona el Synchronous o la 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)

Para obtener más información sobre cómo personalizar el algoritmo de selección de servidores de PyMongo, consulta la siguiente documentación de la API:

Volver

Comprimir el tráfico de la red

En esta página