2012-06-03 12 views
9

Ho valutato Mongoose (un ORM per node.js che utilizza MongoDB per l'archiviazione persistente).Come gestire le interruzioni di connessione del DB Mongoose

Quello che mi piacerebbe fare è assicurarsi che l'app possa essere eseguita quando il DB non è attivo all'avvio dell'app e gestisce anche il DB in modo intelligente.

Attualmente la mia applicazione di test che non funziona in entrambi i casi fa questo:

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

allora io uso quella connessione quando si effettua Models.

Nel caso in cui il DB non sia attivo all'inizio dell'app, tutte le chiamate di salvataggio() su istanze non riescono automaticamente senza errori. Se il DB viene ripristinato, non viene mai scritto.

Quindi avrei bisogno di rilevare che la connessione non è mai avvenuta e l'app è in grado di dirlo a runtime in modo che possa gestirlo in qualche modo.

Quando il DB si interrompe dopo l'avvio dell'app, sebbene le chiamate save() continuino a non causare errori ma vengono accodate e scritte quando il DB ritorna.

Ciò sembra soddisfacente, tranne che mi piacerebbe collegarmi all'API per ottenere eventi quando il DB è inattivo e interrogare quanti salvataggi sono in coda. Ad un certo punto potrei avere così tanti eventi in coda che vorrei semplicemente smettere di crearne di nuovi e far sì che l'app torni indietro.

+0

Conoscete le scritture sicure e getLastError() in mongo? –

+0

Sì, e secondo la documentazione di mangusta la modalità predefinita per uno schema è sicura – justinhj

risposta

10

Caso n. 1: db è inattivo all'avvio dell'app. c'è un piccolo bug che impedisce questo caso d'uso che sto correggendo ora. Tuttavia, qui è il work-around:

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 succo brutto ma lavorando. Primo spegnimento mongo, quindi esegui questo elenco.

Notare i guasti di connessione.

Quindi avviare mongo e vedere tutti gli inserimenti in coda completi e scaricati sulla console. Le scritture e i reperti inizieranno.

Arresta mongo, si noti che gli inserimenti e le ricerche vengono tentati ma non vengono eseguiti callback.

Restart mongo. Si noti che tutti gli inserimenti e i reperti in coda sono stati completati.

+0

Che funziona per me e sembra essere ciò di cui avevo bisogno di lavorare, grazie! – justinhj

+0

@aaronheckmann eventuali cambiamenti con la mangusta 3.x o 4.x corrente? –

4

Se si preferisce non riuscire tutte le richieste al server quando il db è inattivo, il driver nativo emette l'evento di riconnessione che può essere rilevato in un middleware.

Questo funziona ed emette la multa evento riconnessione (MongoDB driver nativo 1.3.23)

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

Quindi il mio DbConnection middleware cerca collegato/errore/ricollegare (alcuni degli eventi sono ridondanti, ma non danneggia !) PS. l'errore di connessione iniziale deve ancora essere gestito da un nuovo tentativo come risposta aaronheckmann sopra.

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.'); 
}); 
Problemi correlati