Stiamo eseguendo un'API Sails.js su Google Container Engine con un database Cloud SQL e recentemente abbiamo riscontrato che alcuni dei nostri endpoint si sono bloccati, non inviando mai una risposta.Google Cloud SQL Nessuna risposta
Ho avuto un monitoraggio dello stato di salute/v1/stato e ha registrato il 100% di operatività quando ho avuto la seguente semplice risposta;
status: function(req, res){
res.ok('Welcome to the API');
}
Non appena abbiamo aggiunto una query al database, l'endpoint ha iniziato a scadere. Non succede sempre, ma apparentemente a intervalli casuali, a volte per ore e ore. Questo è ciò a cui abbiamo modificato la query;
status: function(req, res){
Email.findOne({ value: "[email protected]" }).then(function(email){
res.ok('Welcome to the API');
}).fail(function(err){
res.serverError(err);
});
}
Piuttosto sospetto, tutto questo funziona bene nei nostri ambienti di sosta e di sviluppo, è solo quando il codice viene distribuito in produzione che si verifica il timeout e si verifica solo alcuni del tempo . L'unica cosa che cambia tra staging e produzione è il database a cui ci stiamo connettendo e il carico sul server.
Come accennato in precedenza stiamo utilizzando Google Cloud SQL e l'adattatore Sails-MySQL. Abbiamo i seguenti stack di errori dal server di produzione;
AdapterError: Invalid connection name specified
at getConnectionObject (/app/node_modules/sails-mysql/lib/adapter.js:1182:35)
at spawnConnection (/app/node_modules/sails-mysql/lib/adapter.js:1097:7)
at Object.module.exports.adapter.find (/app/node_modules/sails-mysql/lib/adapter.js:801:16)
at module.exports.find (/app/node_modules/sails/node_modules/waterline/lib/waterline/adapter/dql.js:120:13)
at module.exports.findOne (/app/node_modules/sails/node_modules/waterline/lib/waterline/adapter/dql.js:163:10)
at _runOperation (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/finders/operations.js:408:29)
at run (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/finders/operations.js:69:8)
at bound.module.exports.findOne (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/finders/basic.js:78:16)
at bound [as findOne] (/app/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
at Deferred.exec (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/deferred.js:501:16)
at tryCatcher (/app/node_modules/sails/node_modules/waterline/node_modules/bluebird/js/main/util.js:26:23)
at ret (eval at <anonymous> (/app/node_modules/sails/node_modules/waterline/node_modules/bluebird/js/main/promisify.js:163:12), <anonymous>:13:39)
at Deferred.toPromise (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/deferred.js:510:61)
at Deferred.then (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/deferred.js:521:15)
at Strategy._verify (/app/api/services/passport.js:31:7)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:341:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:342:7)
at Object.AuthController.login (/app/api/controllers/AuthController.js:119:5)
at bound (/app/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
at routeTargetFnWrapper (/app/node_modules/sails/lib/router/bind.js:179:5)
at callbacks (/app/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
Error (E_UNKNOWN) :: Encountered an unexpected error :
Could not connect to MySQL: Error: Pool is closed.
at afterwards (/app/node_modules/sails-mysql/lib/connections/spawn.js:72:13)
at /app/node_modules/sails-mysql/lib/connections/spawn.js:40:7
at process._tickDomainCallback (node.js:381:11)
Guardando solo gli errori, sarei tentato di dire che abbiamo qualcosa configurato in modo errato. Ma il fatto che funzioni un po 'di tempo (e in precedenza ha funzionato bene!) Mi porta a credere che ci sia qualche altra magia nera al lavoro qui. La nostra istanza Cloud SQL è D0 (anche se abbiamo provato ad aumentare la dimensione a D4) e il nostro criterio di attivazione è "Sempre attivo".
EDIT: avevo visto altri lamentarsi di Google Cloud SQL es. this SO post e io ero sospettoso, ma da allora abbiamo spostato il nostro database su Amazon RDS e stiamo ancora riscontrando gli stessi problemi, quindi deve essere un problema con le vele e l'adattatore mysql.
Questo problema sta causando ore di inattività al giorno, abbiamo bisogno che venga risolto, qualsiasi aiuto è molto apprezzato!
Nel collegamento spiega che non vi è alcun limite QPS ma piuttosto un limite massimo di connessioni simultanee. Stiamo usando un'istanza D0 che ha un limite di 250 connessioni simultanee, il massimo che abbiamo mai usato è 12. Grazie per il suggerimento però! –