phantomjs-node se bloquea al intentar escalar detrás de cluster-nodo

Problema de GitHub asociado: https://github.com/sgentle/phantomjs-node/issues/280

Tengo una aplicación sencilla que hace lo siguiente:

var phantom = require('phantom'), express = require('express'), serve = express(); serve.get('/foo', function (req, res) { try { phantom.create(function (ph) { console.log('Phantom browser created w/ pid: ', ph.process.pid); ph.onError = function (msg, trace) { var msgStack = ['PHANTOM ERROR: ' + msg]; if (trace && trace.length) { msgStack.push('TRACE:'); trace.forEach(function (t) { msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : '')); }); } console.log(msgStack.join('\n')); }; ph.createPage(function(page){ page.open('http://www.stackoverflow.com', function(status){ res.json({pageStatus: status}); page.close(); ph.exit(); }); }); }); } catch(e){ console.log(e); throw e; } }); 

Mientras ejecuto esto en WebStorm, funciona bien y puedo llegar al punto final /foo con tantas solicitudes simultáneas como quiera y todo funciona como se espera.

Pero tan pronto como bash escalarlo detrás de PM2 w / pm2 start -i 0 phantomapp.js , todo sigue funcionando bien siempre y cuando no le ofrezco demasiadas solicitudes. La segunda vez que abro dos ventanas del navegador y pm2 logs actualizar en ambas, obtengo lo siguiente en los pm2 logs . En ese punto, TODOS los procesos administrados por PM2 simplemente “desaparecen”. ¿¿Qué estoy haciendo mal?? :

 PM2: 2015-05-27 18:53:17: [PM2] Error caught by domain: PM2: AssertionError: false == true PM2: at RoundRobinHandle.add (cluster.js:140:3) PM2: at queryServer (cluster.js:480:12) PM2: at Worker.onmessage (cluster.js:438:7) PM2: at ChildProcess. (cluster.js:692:8) PM2: at ChildProcess.emit (events.js:129:20) PM2: at handleMessage (child_process.js:324:10) PM2: at Pipe.channel.onread (child_process.js:352:11) PM2: 2015-05-27 18:53:18: [PM2] Automatic `pm2 update` failed. Killing PM2 daemon and its processes... PM2: 2015-05-27 18:53:18: pm2 has been killed by signal, dumping process list before exit... PM2: 2015-05-27 18:53:18: Stopping app:phantomapp id:0 PM2: assert.js:86 PM2: throw new assert.AssertionError({ PM2: ^ PM2: AssertionError: false == true PM2: at RoundRobinHandle.add (cluster.js:140:3) PM2: at queryServer (cluster.js:480:12) PM2: at Worker.onmessage (cluster.js:438:7) PM2: at ChildProcess. (cluster.js:692:8) PM2: at ChildProcess.emit (events.js:129:20) PM2: at handleMessage (child_process.js:324:10) PM2: at Pipe.channel.onread (child_process.js:352:11) phantomapp-0 (err): Process disconnected from parent ! PM2: [PM2] Spawning PM2 daemon PM2: 2015-05-27 18:53:18: [PM2][WORKER] Started with refreshing interval: 30000 PM2: 2015-05-27 18:53:18: [[[[ PM2/God daemon launched ]]]] PM2: 2015-05-27 18:53:18: BUS system [READY] on port /Users/matthewmarcus/.pm2/pub.sock PM2: 2015-05-27 18:53:18: RPC interface [READY] on port /Users/matthewmarcus/.pm2/rpc.sock PM2: [PM2] PM2 Successfully daemonized PM2: Be sure to have the latest version by doing `npm install [email protected] -g` before doing this procedure. PM2: [PM2] Stopping PM2... PM2: [PM2][WARN] No process found PM2: [PM2] All processes have been stopped and deleted PM2: 2015-05-27 18:53:18: PM2 is being killed via kill method PM2: 2015-05-27 18:53:18: RPC socket closed PM2: 2015-05-27 18:53:18: PUB socket closed PM2: [PM2] PM2 stopped PM2: 2015-05-27 18:53:19: [PM2][WORKER] Started with refreshing interval: 30000 PM2: 2015-05-27 18:53:19: [[[[ PM2/God daemon launched ]]]] PM2: 2015-05-27 18:53:19: BUS system [READY] on port /Users/matthewmarcus/.pm2/pub.sock PM2: 2015-05-27 18:53:19: RPC interface [READY] on port /Users/matthewmarcus/.pm2/rpc.sock PM2: >>>>>>>>>> PM2 updated PM2: ┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬────────┬──────────┐ PM2: │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │ PM2: └──────────┴────┴──────┴─────┴────────┴─────────┴────────┴────────┴──────────┘ PM2: Use `pm2 show ` to get more details about an app 

Puede reproducir el mismo problema utilizando un clúster nativo de nodo:

 var cluster = require('cluster'); if(cluster.isMaster){ var cpuCount = require('os').cpus().length; for (var i = 0; i  ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : '')); }); } console.log(msgStack.join('\n')); }; ph.createPage(function(page){ page.open('http://www.stackoverflow.com', function(status){ res.json({pageStatus: status}); page.close(); ph.exit(); }); }); }); } catch(e){ console.log(e); throw e; } }); } 

Lo que produce el siguiente error en la consola al intentar manejar> 1 solicitud al mismo tiempo:

 assert.js:86 throw new assert.AssertionError({ ^ AssertionError: false == true at RoundRobinHandle.add (cluster.js:140:3) at queryServer (cluster.js:480:12) at Worker.onmessage (cluster.js:438:7) at ChildProcess. (cluster.js:692:8) at ChildProcess.emit (events.js:129:20) at handleMessage (child_process.js:324:10) at Pipe.channel.onread (child_process.js:352:11) 

Lo intenté con esta idea y puedo crear el navegador fantasma y obtener una respuesta.

  • Si ejecuto dos tabs en localhost:3000/foo , la segunda se generará solo cuando la primera haya finalizado.
  • Si ejecuto más de dos solicitudes simultáneas en mi navegador (chrome), también obtengo el error.
    • Si bash ejecutar más solicitudes (desde un bash) que la cantidad de clusters que se bloquea.
  • Si ejecuto solicitudes (menor o igual que la cantidad de clúster) desde un script bash, no se bloquea en absoluto.

    Además, me doy cuenta de que con el script bash ejecuto todo al mismo tiempo:

     http GET localhost:3000/foo & http GET localhost:3000/foo & http GET localhost:3000/foo & http GET localhost:3000/foo & 

El error que estás viendo proviene de esta afirmación :

  assert(worker.id in this.all === false); 

Lo que significa que el trabajador ya no está en el round robin.

No creo que esto esté directamente relacionado con PM2 pero hay un error. PM2 no debe estrellarse. Le sugiero a su informe un problema citando este stackoverflow. Sin embargo, no estoy seguro de que pueda solucionarse si se trata de un error de nodo.

Lamentablemente, no hay una solución para esto en este momento, pero puedes echar un vistazo a un problema de nodejs . He leído que iojs solucionó esto, quizás puedas intentarlo;).

Otro relacionado stackoverflow: NodeJS Cluster assert.AssertionError inesperado .