Pregunta Confiabilidad de Node.js para aplicaciones grandes


Soy nuevo en Node.js y actualmente estoy cuestionando su fiabilidad.

En función de lo que he visto hasta ahora, parece haber un error importante: cualquier error / excepción no detectada bloquea el servidor. Claro, puede tratar de proteger su código a prueba de balas o ponerlo en áreas clave, pero casi siempre habrá errores que se escabullen. Y parece peligroso si una solicitud problemática podría afectar a todas las demás solicitudes. Hay 2 soluciones alternativas que encontré:

  1. Use daemon o módulo como Siempre para reiniciar automáticamente el servidor cuando se bloquea. Lo que no me gusta de esto es que el servidor aún está inactivo por un segundo o dos (para un sitio grande, que podría ser cientos (¿miles?) De solicitud).

  2. Captura excepciones no detectadas usando process.on('uncaughtException'). El problema con este enfoque (hasta donde yo sé) es que no hay forma de obtener una referencia a la solicitud que causa la excepción. Entonces esa solicitud particular se deja colgando (el usuario ve el indicador de carga hasta el tiempo de espera). Pero al menos en este caso, otras solicitudes no problemáticas aún pueden ser manejadas.

¿Puede un veterano Node.js lanzar?


32
2018-03-04 20:05


origen


Respuestas:


Para reinicios automáticos y balanceo de carga, le sugiero que revise Learnboost está arriba balancín.

Le permite recargar a un trabajador detrás del equilibrador de carga sin descartar ninguna solicitud. Deja de dirigir nuevas solicitudes al trabajador, pero para las solicitudes existentes que ya se están atendiendo, proporciona workerTimeout período de gracia para esperar a que finalicen las solicitudes antes de que realmente se cierre el proceso.

Puede adaptar esta estrategia para que también sea activada por uncaughtException evento.


3
2018-03-09 18:37



Usted tiene el control total del proceso base, y esa es una característica.

Si compara el nodo a una configuración de Apache / PHP, este último es simplemente equivalente a tener un servidor de nodo simple que envía cada solicitud entrante a su propio proceso que finaliza una vez que se ha manejado la solicitud.

Puedes hacer esa configuración en Nodo si lo deseas, y en muchos casos algo así es probablemente una buena idea. Lo mejor de Node es que puedes romper este patrón, por ejemplo, puedes hacer que el proceso principal u otro proceso permanente se ocupen de la sesión antes de que se pase una solicitud a su manejador.

El nodo es una herramienta muy flexible, que es buena si necesita esta flexibilidad, pero requiere cierta habilidad.


2
2018-03-07 12:37



Las excepciones no bloquean el servidor, generan excepciones.

Los errores en node.js que reducen todo el proceso son una historia diferente.

Tu mejor apuesta (que deberías hacer con alguna tecnología), simplemente pruébela con su aplicación lo antes posible para ver si le queda bien.


1
2018-03-05 02:17



Una excepción no detectada, si no se detecta, bloqueará el servidor. Algo así como llamar a una función mal escrita. yo suelo process.on('uncaughtException') para capturar tales excepciones. Si usa esto, entonces, sí, el error enviado a process.on('uncaughtException') es menos informativo

Por lo general, incluyo un módulo como nomnom para permitir banderas de línea de comandos. Incluyo uno llamado --exceptions que, cuando se establece, puentea process.on('uncaughtException'). Básicamente, si veo que ocurren excepciones no detectadas, entonces, en desarrollo, inicio la aplicación con --exceptions de modo que cuando se produce ese error, no se capture, lo que hace que Node escuche la traza de la pila y luego muera. Esto le dice en qué línea sucedió y en qué archivo.

Capturar las excepciones es una forma de lidiar con eso. Pero, como dijiste, eso significa que si ocurre un error, puede provocar que los usuarios no reciban respuestas, etcétera. De hecho, recomendaría dejar que el error bloquee el servidor. (Yo suelo process.on('uncaughtException') en aplicaciones, no en servidores web). Y usando Siempre. El hecho es que es probable que el servidor web se bloquee y exponga lo que necesita reparar.

Digamos que usaste PHP en lugar de Node. PHP no interrumpe abruptamente el servidor (ya que realmente no sirve). Escupe errores realmente feos. Claro, no da como resultado que todo el servidor se caiga y luego tenga que volver a subir. Nadie quiere que sus clientes tengan tiempo de inactividad. Pero también significa que el problema persistirá y será menos perceptible. Todos hemos visto sitios que han dicho errores, y no se parchan muy rápido. Si tal error fuera tomar todo por un pequeño blip (que honestamente no es tan malo en la imagen más grande) entonces seguramente llamaría la atención sobre sí mismo. Lo verías suceder y rastrearías ese error.

El hecho es que los errores existirán en cualquier sistema, independientemente del idioma o la plataforma. Y podría decirse que es mejor que sean fatales para que sepa que sucedieron. Y con el tiempo hace que te vuelvas más consciente de cómo ocurren estos errores. No sé ustedes, pero conozco a muchos desarrolladores de PHP que cometen los mismos errores comunes una y otra vez.


1
2018-03-09 19:00