5

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!

risposta

1

È possibile raggiungere il limite QPS per Google Cloud SQL? Vedi qui: https://cloud.google.com/sql/faq#sizeqps

+0

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ò! –

1

Perché l'istanza del mio database a volte rallenta a rispondere? Per ridurre al minimo l'importo addebitato per le istanze in base ai piani di fatturazione per utilizzo, per impostazione predefinita l'istanza diventa passiva se non viene acceduta per 15 minuti. La prossima volta che si accede ci sarà un breve ritardo mentre è attivato. È possibile modificare questo comportamento configurando la politica di attivazione dell'istanza. Per un esempio, vedere Modifica di un'istanza utilizzando l'SDK Cloud.

Potrebbe essere correlato alle impostazioni della politica. Se lo si imposta su ON_DEMAND, l'istanza verrà interrotta per salvare il budget in modo che la prima query per l'attivazione dell'istanza sia lenta. Questo potrebbe causare il timeout.

https://cloud.google.com/sql/faq?hl=en

+0

Grazie per il suggerimento, ma non usiamo la politica di attivazione "Sempre attivo", aggiungerò queste informazioni alla mia domanda. –

2

Questo sembra essere un sails issue, e non necessariamente legati alla Cloud SQL.

+0

Grazie Nick! Abbiamo verificato e spostato l'intero database su Amazon RDS come test, ma continuiamo a riscontrare gli stessi problemi. Come dici tu, devi essere vele, anche se quel problema è abbastanza vecchio. Potrebbe essere la stessa cosa, almeno abbiamo qualcosa da testare ora! –