2012-06-03 24 views
9

He estado evaluando Mongoose (un ORM para node.js que usa MongoDB para almacenamiento persistente).Cómo manejar las interrupciones de conexión Mongoose DB

Lo que me gustaría hacer es asegurarme de que la aplicación se pueda ejecutar cuando la base de datos no esté activa cuando se inicia la aplicación, y también maneja la base de datos de manera inteligente.

Actualmente mi aplicación de prueba que no funciona en cualquiera de los casos hace esto:

var mongoose_connection = mongoose.createConnection(DATABASE_URL, {server:{poolSize:4}}); 

Entonces utilizar esa conexión al hacer modelos.

En el caso en que el DB está inactivo al inicio de la aplicación, cualquier llamada a save() en las instancias falla silenciosamente sin error. Si la base de datos vuelve a aparecer, nunca se escriben.

Así que tendría que detectar que la conexión nunca sucedió y que la aplicación pueda decir eso en tiempo de ejecución para poder manejarlo de alguna manera.

Cuando el DB baja después de que la aplicación ha comenzado, las llamadas a save() aún no causan errores, pero están en cola y escritas cuando vuelve la base de datos.

Parece estar bien, excepto que me gustaría conectarme a la API para obtener eventos cuando la base de datos está inactiva y para consultar cuántos guardados están en cola. En algún momento podría tener tantos eventos en cola que me gustaría dejar de hacer otros nuevos y hacer que la aplicación retroceda.

+0

¿Usted sabe sobre las escrituras seguras y getLastError() en mongo? –

+0

Sí, y de acuerdo con la documentación de mangosta, el modo predeterminado para un esquema es seguro – justinhj

Respuesta

10

Caso n. ° 1: db no está funcionando. hay un error menor que evita este caso de uso que estoy solucionando ahora. Sin embargo, aquí está la solución alternativa:

var db = mongoose.createConnection(); 
db.on('error', function (err) { 
    if (err) // couldn't connect 

    // hack the driver to allow re-opening after initial network error 
    db.db.close(); 

    // retry if desired 
    connect(); 
}); 

function connect() { 
    db.open('localhost', 'dbname'); 
} 

connect(); 

https://gist.github.com/2878607

Un GIST fea pero trabajando. Primero apaga mongo, luego ejecuta esta idea.

Observe los errores de conexión.

Luego, inicie mongo y vea todas las inserciones en cola completadas y descargadas a la consola. Las escrituras y los hallazgos comenzarán.

Apagar mongo, observe que las inserciones y los hallazgos se están intentando pero no se ejecutan las devoluciones de llamada.

Reiniciar mongo. Observe que se completaron todas las inserciones y los complementos puestos en cola.

+0

Eso me funciona y parece ser lo que necesitaba para trabajar, ¡gracias! – justinhj

+0

@aaronheckmann cualquier cambio con la mangosta 3.x o 4.x actual? –

4

Si prefiere fallar todas las solicitudes al servidor cuando el db está inactivo, el controlador nativo emite el evento de reconexión que se puede detectar en un middleware.

Esto funciona y emite la multa evento de reconexión (controlador nativo MongoDB 1.3.23)

mongoose.connection.db.on('reconnect', function (ref) { 
    connected=true; 
    console.log('reconnect to mongo server.'); 
}); 

Así que mi DbConnection middleware busca conectado/error/reconectar (algunos de los eventos son redundantes, pero no hace daño !) PS. la falla de conexión inicial necesita ser manejada por un reintento como respuesta de aaronheckmann arriba.

mongoose.connection.on('open', function (ref) { 
    connected=true; 
    console.log('open connection to mongo server.'); 
}); 

mongoose.connection.on('connected', function (ref) { 
    connected=true; 
    console.log('connected to mongo server.'); 
}); 

mongoose.connection.on('disconnected', function (ref) { 
    connected=false; 
    console.log('disconnected from mongo server.'); 
}); 

mongoose.connection.on('close', function (ref) { 
    connected=false; 
    console.log('close connection to mongo server'); 
}); 

mongoose.connection.on('error', function (err) { 
    connected=false; 
    console.log('error connection to mongo server!'); 
    console.log(err); 
}); 

mongoose.connection.db.on('reconnect', function (ref) { 
    connected=true; 
    console.log('reconnect to mongo server.'); 
}); 
Cuestiones relacionadas