Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Personalizar selección de servidor

Todos los drivers de MongoDB siguen un algoritmo definido al seleccionar un servidor del cual leer o al que guardar. Mediante el uso del server_selector propiedad de MongoClient, puedes personalizar este algoritmo para elegir el servidor que funcione mejor para tu 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 aleatoriamente un servidor de entre los que todavía están en la lista y ejecuta la operación en ese 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, el cual 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, escribe una función en Python para seleccionar tus servidores preferidos. La función de selección de servidor debe cumplir con 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 objetos ServerDescription:

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, considera el caso en que tu algoritmo no encuentre servidores coincidentes. Si tu función devuelve una lista vacía, tu aplicación no puede comunicarse con MongoDB. Por lo tanto, devuelve una lista que contenga al menos un objeto de ServerDescription de tu función.

En este ejemplo, si no se encuentra ningún servidor coincidente, la función prefer_local devuelve la lista de servidores que se entregó 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