2012-03-05 25 views
5

Tengo un Procfile así:La comunicación entre dos procesos en heroku (qué puerto usar)

web:  bundle exec rails server -p $PORT 
em:  script/eventmachine 

El proceso em incendios hasta un EventMachine con start_server (puerto ENV['PORT']) y mi proceso de banda de vez en cuando necesita comunicarse con eso.

Mi pregunta es, ¿cómo sabe el proceso web con qué puerto comunicarse? Si entiendo heroku correctamente, te asigna un puerto aleatorio cuando se inicia el proceso (y puede cambiar si el ps se mata o se reinicia). ¡Gracias!

Respuesta

3

Los procesos están aislados y no se pueden comunicar directamente entre sí.

http://www.12factor.net/processes

Hay, sin embargo, algunas otras maneras. Uno es usar un servicio de respaldo como Redis o Postgres para actuar como intermediario; otro es usar FIFO para comunicarse.

http://en.wikipedia.org/wiki/FIFO

Es una buena cosa que sus procesos están aislados y no compartición, pero sí es necesario para la arquitectura de su aplicación de forma ligeramente diferente para acomodar esto.

+2

Sí, podría hacer una cola de fifo en redis o algo así, pero ¿está seguro de que se trata de procesos que no pueden comunicarse entre ellos? Los servidores/clientes de Eventmachine pueden comunicarse entre sí a través de tcpip estándar al igual que el proceso web acepta solicitudes de tcpip entrantes. Simplemente no sé en qué puerto conectarme. Gracias por la respuesta, la página de 12factores de Adam Wiggins es realmente interesante. –

+1

Sí. Su proceso web tiene asignado un puerto para recibir solicitudes del mundo exterior; no hay otra comunicación entre procesos. Consulte esta pregunta similar aquí: http://stackoverflow.com/questions/9322599/tcp-socket-communication-between-processes-on-heroku-worker-dyno/9453432#9453432 –

+1

Muy bien gracias, esto fue útil. Terminé usando un modelo de pub/sub con Redis que funcionó. Aunque no es durable, entonces puedo probar iron_mq después de esto y encuestarlo de eventmachine. ¡Gracias por la ayuda! Realmente lo aprecio. –

1

Según la documentación Heroku,

dos procesos que se ejecutan en el mismo banco de pruebas pueden comunicarse a través de TCP/IP utilizando cualquier puertos que quieren.

Dos procesos que se ejecutan en diferentes dynos no se pueden comunicar a través de TCP/IP en absoluto. Necesitan usar memcached, o la base de datos, o uno de los complementos de Heroku, para comunicarse.

+0

La versión actual de la documentación de esto es [aquí] (https://devcenter.heroku.com/articles/dynos#networking) – weibeld

Cuestiones relacionadas