tutorial start script run nodejs node node.js heroku redis rabbitmq kue

node.js - script - npm start heroku



¿Cómo comunicar los dinnos Web y Worker con Node.js en Heroku? (2)

Como sugiere el artículo de alto nivel sobre trabajos en segundo plano y colas , sus dindes web necesitarán comunicarse con sus dynos de trabajadores a través de un mecanismo intermedio (a menudo una cola).

Para lograr lo que parece que esperas seguir este enfoque general:

  • La solicitud web es recibida por el dyno web
  • Web dyno agrega un trabajo a la cola
  • El dinamómetro de trabajador recibe trabajo de la cola
  • El dinamómetro de trabajo ejecuta un trabajo y escribe el progreso incremental en un componente compartido
  • El sondeo del lado del navegador solicita el estado del trabajo desde el dinamómetro web
    • Web dyno consulta el componente compartido para el progreso del trabajo en segundo plano y devuelve el estado al navegador
  • Worker dyno completa la ejecución del trabajo y lo marca como completo en el componente compartido
  • El sondeo del lado del navegador solicita el estado del trabajo desde el dinamómetro web
    • Web dyno consulta el componente compartido para el progreso del trabajo en segundo plano y envía el estado completado nuevamente al navegador

En cuanto a la implementación real, no estoy muy familiarizado con las mejores bibliotecas en Node.js, pero los componentes que pegan este proceso están disponibles en Heroku como add-ons .

Queue: AMQP es un protocolo de cola bien soportado y el add-on de CloudAMQP puede servir como la cola de mensajes entre su web y los dinnos de los trabajadores.

Estado compartido: puede usar uno de los complementos de Postgres para compartir el estado de un trabajo que está siendo procesado o algo más funcional como Memcache o Redis .

Entonces, para resumir, debe usar un componente de complemento intermedio para comunicarse entre dynos en Heroku. Si bien este enfoque implica un poco más de ingeniería, el resultado es una arquitectura correctamente desacoplada y escalable.

Web Dynos puede manejar solicitudes HTTP

y mientras Web Dynos los maneja, Worker Dynos puede manejar los trabajos a partir de él.

Pero no sé cómo hacer que Web Dynos y Worker Dynos se comuniquen entre sí.

Por ejemplo, quiero recibir una solicitud HTTP de Web Dynos

, envíalo a Dynos Trabajadores

, procese el trabajo y envíe el resultado a Web Dynos

, muestra los resultados en la Web.

¿Es esto posible en Node.js? (Con RabbitMQ o Kue o etc.)?

No pude encontrar un ejemplo en la documentación de Heroku

¿O debería implementar todos los códigos en Web Dynos y escalar solo Web Dynos ?


Por lo que puedo decir, Heroku no proporciona una forma de comunicarse por ti, por lo que tendrás que construirlo tú mismo. Para comunicarse con otro proceso usando Node, probablemente tendrá que tratar el proceso ''stdin / out / err manualmente, algo como esto:

var attachToProcess = function(pid) { return { stdin: fs.createWriteStream(''/proc/'' + pid + ''/fd/0''), stdout: fs.createReadStream(''/proc/'' + pid + ''/fd/1''), stderr: fs.createReadStream(''/proc/'' + pid + ''/fd/2'') }; }; var pid = fs.readFile(''/path/to/worker.pid'', ''utf8'', function(err, pid) { if (err) {throw err;} var worker = attachToProcess(Number(pid)); worker.stdin.write(...); });

Luego, en su proceso de trabajo, tendrá que almacenar el pid en ese archivo pid:

fs.writeFile(''/path/to/worker.pid'', process.pid, function(err) { if (err) {throw err;} });

En realidad, no he probado nada de esto, por lo que es probable que tome algo de trabajo y construir sobre él, pero creo que la idea básica es clara.

Editar

Me di cuenta de que también etiquetó esto con "redis", y pensé que debería agregar que también puede usar redis pub / sub para comunicarse entre sus diversos procesos como se explica en el readme de node_redis .