Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
12
respostas

Local funciona bem, da crash no Heroku (Error: Quit inactivity timeout)

Após subir a aplicação para o Heroku e testar a comunicação via socket.io, funciona corretamente. Após alguns segundos de ter feito isso, a aplicação da crash e no lugar é mostrada a mensagem no navegador "Application Error" assim que eu atualizo a pagina.

O log é o seguinte:

2016-08-10T14:21:57.174776+00:00 app[web.1]: events.js:141
2016-08-10T14:21:57.174787+00:00 app[web.1]:       throw er; // Unhandled 'error' event
2016-08-10T14:21:57.174788+00:00 app[web.1]:       ^
2016-08-10T14:21:57.174788+00:00 app[web.1]: 
2016-08-10T14:21:57.174789+00:00 app[web.1]: Error: Quit inactivity timeout
2016-08-10T14:21:57.174790+00:00 app[web.1]:     at Quit.<anonymous> (/app/node_modules/mysql/lib/protocol/Protocol.js:160:17)
2016-08-10T14:21:57.174791+00:00 app[web.1]:     at emitNone (events.js:67:13)
2016-08-10T14:21:57.174791+00:00 app[web.1]:     at Quit.emit (events.js:166:7)
2016-08-10T14:21:57.174794+00:00 app[web.1]:     at Quit._onTimeout (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:126:8)
2016-08-10T14:21:57.174795+00:00 app[web.1]:     at Timer.listOnTimeout (timers.js:89:15)
2016-08-10T14:21:57.185663+00:00 app[web.1]: 
2016-08-10T14:21:57.190588+00:00 app[web.1]: npm ERR! Linux 3.13.0-91-generic
2016-08-10T14:21:57.190963+00:00 app[web.1]: npm ERR! argv "/app/.heroku/node/bin/node" "/app/.heroku/node/bin/npm" "start"
2016-08-10T14:21:57.191178+00:00 app[web.1]: npm ERR! node v4.1.1
2016-08-10T14:21:57.191548+00:00 app[web.1]: npm ERR! npm  v2.14.4
2016-08-10T14:21:57.191857+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2016-08-10T14:21:57.192046+00:00 app[web.1]: npm ERR! casadocodigo@1.0.0 start: `node app`
2016-08-10T14:21:57.192208+00:00 app[web.1]: npm ERR! Exit status 1
2016-08-10T14:21:57.192395+00:00 app[web.1]: npm ERR! 
2016-08-10T14:21:57.192561+00:00 app[web.1]: npm ERR! Failed at the casadocodigo@1.0.0 start script 'node app'.
2016-08-10T14:21:57.192779+00:00 app[web.1]: npm ERR! This is most likely a problem with the casadocodigo package,
2016-08-10T14:21:57.192969+00:00 app[web.1]: npm ERR! not with npm itself.
2016-08-10T14:21:57.193140+00:00 app[web.1]: npm ERR! Tell the author that this fails on your system:
2016-08-10T14:21:57.193308+00:00 app[web.1]: npm ERR!     node app
2016-08-10T14:21:57.193472+00:00 app[web.1]: npm ERR! You can get their info via:
2016-08-10T14:21:57.193645+00:00 app[web.1]: npm ERR!     npm owner ls casadocodigo
2016-08-10T14:21:57.193810+00:00 app[web.1]: npm ERR! There is likely additional logging output above.
2016-08-10T14:21:57.196399+00:00 app[web.1]: 
2016-08-10T14:21:57.196630+00:00 app[web.1]: npm ERR! Please include the following file with any support request:
2016-08-10T14:21:57.196806+00:00 app[web.1]: npm ERR!     /app/npm-debug.log
2016-08-10T14:21:57.305443+00:00 heroku[web.1]: Process exited with status 1
2016-08-10T14:21:57.215660+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=websocket&sid=pXATLDpyA-XZlIVxAAAA" host=cdc-nodejs-jon.herokuapp.com request_id=ca70e067-3763-4bd0-b5af-e4d299d5ae5e fwd="195.113.224.147" dyno=web.1 connect=2ms service=29112ms status=101 bytes=175
2016-08-10T14:21:57.315357+00:00 heroku[web.1]: State changed from up to crashed
2016-08-10T14:21:58.663629+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/socket.io/?EIO=3&transport=polling&t=LPqrCt8" host=cdc-nodejs-jon.herokuapp.com request_id=65fb266d-6e7b-4397-b7cf-5d33de97b4e1 fwd="195.113.224.147" dyno= connect= service= status=503 bytes=

e essa última linha de App crashed fica repetindo pra sempre até eu reiniciar o dyno. Não consegui corrigir esse erro. Será um problema da lib mysql?

12 respostas

Oi Jonathas,

Dei uma googlada e acabei achando uma issue do driver => https://github.com/mysqljs/mysql/issues/1223. Ele fala da versão do node e também de uma possível problema de rede mesmo.

solução!

Oi Alberto,

Configurei no Heroku com as versões 6.3.1, 6.2.2, 4.3.x, 4.2.3 e 4.2.1 do Node, mas o problema continuou.

Pesquisando mais, vi que algumas pessoas que tiveram esse problema de timeout no MySQL tiveram que configurar connection pooling.

Configurei o MySQL com pool para reaproveitar as conexões e dar release quando terminasse de usá-las, como implementado aqui (entre outros links que abri na hora): https://www.codementor.io/nodejs/tutorial/node-js-mysql

Problema resolvido, a aplicação não está mais morrendo por conta de timeout do MySQL.

=====================================

Como o artigo está falando sobre um software chamado siege pra simular acessos simultâneos, resolvi testar também e acabei descobrindo outro problema:

siege -c10 -t1M http://localhost:3000

Após um tempo, eu recebia a mensagem:

ER_CON_COUNT_ERROR: Too many connections

No Heroku com limite de 10 conexões simultâneas pelo ClearDB e no meu PC, onde setei para 100 no máximo.

O gerenciamento do release da conexão não estava funcionando tão bem e a aplicação travava após esse erro. https://stackoverflow.com/questions/27386205/node-mysql-pool-not-ending-closing https://github.com/mysqljs/mysql/issues/657 https://github.com/mysqljs/mysql/issues/999 https://github.com/mysqljs/mysql/issues/712

Consegui então melhorar esse gerenciamento, colocar um listener pra fila e reiniciar o pool caso esse erro aconteça.

Testei com o siege usando 250 simultaneos no meu PC e 10 no Heroku, e agora a aplicação não morre mais lá. Agora no log do Heroku ele mostra:

2016-08-10T22:09:35.854620+00:00 app[web.1]: Connection released

e continua o processamento.

Coloquei no github: https://github.com/jonathas/casadocodigo/tree/master/app/infra

Boa tarde Jonathas,

Obrigado por disponibilizar uma solucao tão detalhada.

Estava correndo atras desse mesmo erro e graças a isso conseguir resolve.

Tentei com o instrutor do curso e mesmo ele nao soube sugerir uma solucao e nao lembrou que voce havia postado essa.

Thank you.

Opa gente, não lembrava mesmo desse tópico, me desculpem.

@Jaqueline: De nada, fico feliz em ter ajudado!

Opa Jonathas blz ? Estou com o mesmo problema que o seu, vi o seu exemplo, porém não encontrei onde vc esta criando e passando a "connection", pode me ajudar ?

Oi Fernando, a connection vai no callback the this._app.infra.connectionFactory aqui https://github.com/jonathas/casadocodigo/blob/master/app/infra/ProdutosDAO.js , que é o retornada no callback de pool.getConnection em connectionFactory.js

Foi falha minha , achei aqui o connection, fiz o mesmo exemplo que o seu esta dando o erro Cannot read property 'getConnection' of null , pegou esse erro ?

Você chamou o construtor _criaPool(); ?

Desculpa minha ignorancia, meu forte mesmo é android, fiz igual o seu exemplo, e estou instanciando no meu controllers : var profissionalDao = new application.models.ProfissionalDao(application); profissionalDao.login(dataForm, function(error, result){ } Ja a classe connectFactory deixei igual a sua.

insira seu código aqui var profissionalDao = new application.models.ProfissionalDao(application);

profissionalDao.login(dataForm, function(error, result){ if(error){ res.status(500).json(error); return; }

res.status(200).json({data : result[0]});

};

ProfissionalDao.prototype.login = function(dataForm, callback){ var sql = "SELECT * FROM profissional where email = '" + dataForm.email + "' and senha = '" + dataForm.senha + "'"; console.log(' sql : ' + sql);

// this._connection.query(sql, callback);

this._application.models.connectFactory(function(err, connection){ console.log('dentro de connectFactory'); connection.query(sql, function(error, result){ connection.release(); callback(error, result); }); });

}

Boa tarde Jonathas,

Obrigado por disponibilizar a correção detalhada.

Estava correndo atras desse mesmo erro e graças a isso conseguir resolve.