2011-06-01 23 views
5

Estoy usando NodeJS para ejecutar un servidor de socket (usando socket.io). Cuando un cliente se conecta, quiero abrir y ejecutar un módulo que hace un montón de cosas. Aunque tengo la precaución de tratar de captar tanto como sea posible, cuando este módulo arroja un error, obviamente se lleva todo el servidor de socket con él.NodeJS: proceso del nodo secundario?

¿Hay alguna manera de separar los dos, por lo tanto, si falla la secuencia de comandos del módulo de clientes conectados, no se elimina todo el servidor?

Supongo que este es el proceso hijo, pero la documentación no menciona el inicio de otras instancias de nodos.

Obviamente tendré que matar el proceso si el cliente se desconecta también.

Respuesta

5

Supongo que estos módulos de los que está hablando son código JS. Si es así, es posible que desee probar el vm module. Esto le permite ejecutar el código en un contexto separado, y también le da la posibilidad de hacer un try/catch en torno a la ejecución del código específico.

Puede ejecutar el nodo como un proceso separado y ver los datos pasar usando spawn, luego observe los eventos stderr/stdout/exit para rastrear cualquier progreso. Entonces kill se puede utilizar para matar el proceso si el cliente se desconecta. Sin embargo, tendrá que asignar clientes y generar procesos, por lo que su evento de desconexión provocará que el proceso se cierre correctamente.

Finalmente, el evento uncaughtException se puede utilizar como un "catch-all" para cualquier excepción perdida, haciendo que el servidor no muera completamente (las señales son una excepción, por supuesto).

1

Como se señaló en el otro cartel, podría aprovechar el módulo 'vm', pero como podrá deducir del resto de la respuesta, hacerlo agrega una complejidad considerable.

Asimismo, desde el vm doc:

 
Note that running untrusted code is a tricky business requiring great care. 
To prevent accidental global variable leakage, vm.runInNewContext is quite 
useful, but safely running untrusted code requires a separate process. 

Aunque estoy seguro de que podría ejecutar una nueva instancia nodejs en un proceso hijo, lo mejor es entender donde su aplicación puede y va fallar, y luego programar a la defensiva para manejar todas las posibles condiciones de error.

Si alguna parte de su código "toma (n) el servidor completo", entonces realmente debe entender por qué ocurrió esto y resolver ese problema en lugar de confiar en otro proceso para protegerlo del trabajo requerido para diseñar y construir un servicio de calidad de producción.

Cuestiones relacionadas