ACTUALIZACIÓN: estoy usando la versión 2.1 en el controlador, en contra de 3.2

Tengo un nodo de la aplicación que utiliza MongoDB. El problema que tengo es que si el servidor de MongoDB no funciona por alguna razón, la aplicación no se vuelva a conectar.
Para obtener este derecho, he basado mis pruebas en el código de este tutorial oficial.

var MongoClient = require('mongodb').MongoClient
  , f = require('util').format;

MongoClient.connect('mongodb://localhost:27017/test', 

//Optional: uncomment if necessary
//{ db: { bufferMaxEntries: 3 } },


function(err, db) {
  var col = db.collection('t');

  setInterval(function() {
    col.insert({a:1}, function(err, r) {
      console.log("insert")
      console.log(err)

      col.findOne({}, function(err, doc) {
        console.log("findOne")
        console.log(err)
      });
    })
  }, 1000)
});

La idea es ejecutar esta secuencia de comandos y, a continuación, deje de mongod, y, a continuación, reinícielo.
Así que, aquí vamos:

PRUEBA 1: detener mongod durante 10 segundos

Detener MongoDb durante 10 segundos, el resultado deseado: se va a detener la ejecución de las consultas de los 10 segundos y, a continuación, ejecutará todos ellos una vez que el servidor está de vuelta ip

PRUEBA 2: detener la mongod durante 30 segundos

Después de exactamente 30 segundos, puedo comenzar a recibir:

{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' }
insert

{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' }

El problema es que a partir de este, al reiniciar mongod, la conexión no es re-establecida.

Soluciones?

¿Este problema tiene una solución? Si es así, ¿sabes lo que es?
Una vez que mi app comienza a vomitar «topología fue destruido», la única manera de conseguir que todo funcione de nuevo es reiniciar toda la aplicación…

  • Usted puede acercarse a este problema desde la dirección equivocada. Basado en la cadena de conexión, la aplicación se conecta a un nodo único ejemplo de una base de datos. Si el tiempo es necesario para su aplicación, usted debería considerar la conexión a un conjunto de réplicas con múltiples datos de rodamiento de los nodos. El conductor, si se configura correctamente, volverá a conectarse automáticamente al nuevo nodo Principal después de una conmutación por error.
InformationsquelleAutor Merc | 2016-09-29

6 Comentarios

  1. 22

    Hay 2 opciones de conexión que controlan cómo mongo nodejs conductor vuelve a conectar después de un error de conexión

    • reconnectTries: intento de volver a conectar #de veces (por defecto 30 veces)
    • reconnectInterval: Servidor espera a # milisegundos entre reintentos
      (por defecto 1000 ms)

    referencia en mongo conductor docs

    Lo que significa que mongo seguirá intentando conectarse 30 veces por defecto y esperar 1 segundo antes de cada reintento. Que es por qué empezar viendo errores después de 30 segundos.

    Debe ajustar estos 2 parámetros basados en sus necesidades como en este ejemplo.

    var MongoClient = require('mongodb').MongoClient,
        f = require('util').format;
    
    MongoClient.connect('mongodb://localhost:27017/test', 
        {
            //retry to connect for 60 times
            reconnectTries: 60,
            //wait 1 second before retrying
            reconnectInterval: 1000
        },
    
        function(err, db) {
            var col = db.collection('t');
    
            setInterval(function() {
                col.insert({
                    a: 1
                }, function(err, r) {
                    console.log("insert")
                    console.log(err)
    
                    col.findOne({}, function(err, doc) {
                        console.log("findOne")
                        console.log(err)
                    });
                })
            }, 1000)
        });

    Esto tratará de 60 veces en lugar de la predeterminada de 30, lo que significa que vamos a empezar viendo errores después de 60 segundos cuando se deja de intentar volver a conectar.

    Nota al margen: si desea evitar que la aplicación o solicitud de esperar hasta el vencimiento de la reconexión, período en el cual usted tiene que pasar a la opción bufferMaxEntries: 0. El precio de esto es que las peticiones son también abortado durante breves interrupciones en la red.

    • He actualizado la respuesta con el controlador/mongo versión. Sigue siendo el mismo? Me pregunto porque el «connect», el documento hace mención { server: ... } : mongodb.github.io/nodo-mongodb-nativo/2.1/tutoriales/conectar sin Embargo, el doc para «ajustes de Conexión» (vinculado desde este mismo enlace): mongodb.github.io/nodo-mongodb-nativo/2.1/referencia/conexión/… no menciona {server: ...} en todos los…
    • He probado con las mismas versiones y las opciones de objeto parece estar funcionando con o sin server:{ ... }. Supongo que es por allí por motivos heredados. Me lo sacó de la respuesta de la simplicidad. Déjame saber si funciona para usted.
    • OH a MI me refería a dar la recompensa a esta respuesta, y se me ha concedido a otra!!!
    • Usted me la dio..y aquí no hay opción de volver.😐
    • nooooooooooooooo.com
  2. 5

    Por defecto, el Mongo controlador intentará volver a conectarse 30 veces, uno cada segundo. Después de eso, no intente volver a conectar de nuevo.

    Puede establecer el número de reintentos a Número.MAX_VALUE para mantener la reconexión «casi siempre»:

        var connection = "mongodb://127.0.0.1:27017/db";
        MongoClient.connect(connection, {
          server : {
            reconnectTries : Number.MAX_VALUE,
            autoReconnect : true
          }
        }, function (err, db) {
    
        });
  3. 3

    paquete.json: "mongodb": "3.1.3"

    Vuelva a conectar las conexiones existentes

    Para afinar la reconexión de configuración para la pre-establecidas las conexiones, puede modificar la reconnectTries/reconnectInterval opciones (los valores predeterminados y documentación adicional aquí).

    Vuelva a conectar la conexión inicial

    Para la conexión inicial, el mongo cliente no se vuelve a conectar si encuentra un error (ver más abajo). Creo que debe, pero mientras tanto, he creado la siguiente solución el uso de la promesa-reintentar de la biblioteca (que utiliza una interrupción exponencial de la estrategia).

    const promiseRetry = require('promise-retry')
    const MongoClient = require('mongodb').MongoClient
    
    const options = {
      useNewUrlParser: true,
      reconnectTries: 60,
      reconnectInterval: 1000,
      poolSize: 10,
      bufferMaxEntries: 0
    }
    
    const promiseRetryOptions = {
      retries: options.reconnectTries,
      factor: 1.5,
      minTimeout: options.reconnectInterval,
      maxTimeout: 5000
    }
    
    const connect = (url) => {
      return promiseRetry((retry, number) => {
        console.log(`MongoClient connecting to ${url} - retry number: ${number}`)
        return MongoClient.connect(url, options).catch(retry)
      }, promiseRetryOptions)
    }
    
    module.exports = { connect }

    Mongo Inicial Error De Conexión: failed to connect to server [db:27017] on first connect

  4. 2

    Está sucediendo porque se podría haber cruzado el reintento de conexión de límite. Después de que el número de reintentos es destruir la conexión TCP y se quede inactivo. Así que para aumentar el número de reintentos y sería mejor si aumenta la brecha entre reintento de conexión.

    Uso siguientes opciones:

    retryMiliSeconds {Number, default:5000}, number of milliseconds between retries.
    numberOfRetries {Number, default:5}, number of retries off connection.

    Para obtener más detalles, consulte este enlace https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html

    Solución:

    MongoClient.connect("mongodb://localhost:27017/integration_test_?", {
        db: {
          native_parser: false,
    retryMiliSeconds: 100000,
    numberOfRetries: 100
        },
        server: {
          socketOptions: {
            connectTimeoutMS: 500
          }
        }
      }, callback)
  5. 1

    Comportamiento puede variar con diferentes versiones de controlador. Se debe mencionar su versión de controlador.

    versión de controlador : 2.2.10 (el más reciente)
    mongo db versión : 3.0.7

    A continuación el código extenderá el tiempo de mongod puede tomar para volver arriba.

    var MongoClient = require('mongodb').MongoClient
      , f = require('util').format;
    
    function connectCallback(err, db) {
      var col = db.collection('t');
    
      setInterval(function() {
        col.insert({a:1}, function(err, r) {
          console.log("insert")
          console.log(err)
    
          col.findOne({}, function(err, doc) {
            console.log("findOne")
            console.log(err)
          });
        })
      }, 1000)
    }
    var options = { server: { reconnectTries: 2000,reconnectInterval: 1000 }} 
    MongoClient.connect('mongodb://localhost:27017/test',options,connectCallback);

    2º argumento puede ser usado para pasar las opciones del servidor.

  6. 1

    Con mongodb conductor 3.1.10, puedes configurar tu conexión como

    MongoClient.connect(connectionUrl, {
        reconnectInterval: 10000, //wait for 10 seconds before retry
        reconnectTries: Number.MAX_VALUE, //retry forever
    }, function(err, res) {
        console.log('connected') 
    })

    Usted no tiene que especificar autoReconnect: true ya que es el valor predeterminado.

Dejar respuesta

Please enter your comment!
Please enter your name here