¿Cuál es la diferencia entre OpenResty y NGINX?
API7.ai
September 9, 2022
Las ventajas de OpenResty son evidentes. Antes de profundizar en los detalles, repasemos brevemente el proceso de desarrollo de OpenResty, lo que te ayudará a comprender mejor el contenido que sigue.
Proceso de desarrollo de OpenResty
OpenResty no se construyó desde cero como otros lenguajes de desarrollo, sino que se basa en componentes de código abierto maduros: NGINX y LuaJIT. OpenResty nació en 2007, pero su primera versión no eligió Lua, sino Perl, lo cual tiene mucho que ver con la preferencia técnica del autor.
Sin embargo, el rendimiento de Perl estaba lejos de cumplir con los requisitos, por lo que en la segunda versión, Perl fue reemplazado por Lua. No obstante, en el proyecto oficial de OpenResty, Perl todavía juega un papel importante. Los proyectos del ecosistema de OpenResty se construyen con Perl, como el marco de pruebas, Linter, CLI, etc. Los presentaremos paso a paso más adelante.
Debido a que el alto rendimiento y las ventajas dinámicas de OpenResty son muy adecuados para las necesidades del negocio de CDN, OpenResty pronto se convirtió en el estándar técnico de CDN. Además, a través de las ricas bibliotecas lua-resty-*
, OpenResty comenzó a desprenderse gradualmente de la sombra de NGINX y a formar su propio ecosistema, que se utiliza ampliamente en puertas de enlace API, WAFs suaves y otros campos.
A menudo digo que OpenResty es una tecnología ampliamente utilizada, pero no es una tecnología popular, lo que suena contradictorio. ¿Qué significa?
Es ampliamente utilizado porque OpenResty es ahora el quinto servidor web más extenso del mundo.
No es popular porque la proporción de uso de OpenResty para construir sistemas de negocio no es alta. La mayoría de los usuarios utilizan OpenResty para procesar el tráfico de entrada y no profundizan en el negocio. Por lo tanto, naturalmente, el uso de OpenResty es solo superficial y es suficiente para satisfacer las necesidades actuales. Esto, por supuesto, también está relacionado con la falta de marcos web maduros y ecosistemas como los de Java y Python en OpenResty.
Dicho todo esto, a continuación me centraré en presentar algunos aspectos del proyecto de código abierto OpenResty que merecen elogios y aprendizaje.
Aspectos destacados de OpenResty
Documentación detallada y casos de prueba
Sí, la documentación y las pruebas son indicadores críticos de si un proyecto de código abierto es confiable, incluso por delante de la calidad del código y el rendimiento.
La documentación de OpenResty es muy detallada, y el autor ha escrito cada punto que necesita atención en la documentación. La mayoría de las veces, solo necesitamos leer cuidadosamente la documentación para resolver el problema que encontramos sin necesidad de buscar en Google o rastrear el código fuente. Para mayor comodidad, OpenResty también incluye una herramienta de línea de comandos, restydoc
, diseñada para ayudarte a ver la documentación a través del shell y evitar interrupciones en el proceso de codificación.
Sin embargo, solo hay uno o dos fragmentos de código disponibles en la documentación, y no hay ejemplos completos y complejos. ¿Dónde puedo encontrar tales ejemplos?
Para OpenResty, naturalmente es el directorio /t
, que contiene todos los casos de prueba. Cada caso de prueba incluye la configuración completa de NGINX y el código Lua, así como los datos de entrada y salida esperada. Sin embargo, el marco de pruebas de OpenResty es completamente diferente de otros marcos de pruebas de estilo de aserción, lo cual presentaré en un capítulo especial más adelante.
Sincronización no bloqueante
La corrutina es una nueva característica que muchos lenguajes de scripting han añadido en los últimos años para mejorar el rendimiento. Pero no están perfectamente implementadas, algunas son azúcar sintáctico y otras requieren declaraciones explícitas de palabras clave.
OpenResty ha soportado corrutinas desde el primer día e implementa un modelo de programación sincrónico no bloqueante. Esto es importante porque los programadores también son humanos, y el código debería estar más alineado con los hábitos de pensamiento humano. Las devoluciones de llamada explícitas y las palabras clave asíncronas interrumpen el pensamiento y dificultan la depuración.
Entonces, ¿qué es la sincronización no bloqueante? Hablemos primero de la sincronización. Esto es muy simple: ejecutar secuencialmente según el código. Por ejemplo, el siguiente pseudocódigo:
local res, err = query-mysql(sql)
local value, err = query-redis(key)
En la misma solicitud, si tenemos que esperar a que el resultado de la consulta de MySQL regrese antes de continuar consultando Redis, eso es sincrónico; si no necesitamos esperar el retorno de MySQL y podemos continuar consultando Redis, entonces es asíncrono. Para OpenResty, la mayoría de las operaciones son sincrónicas. Solo las API relacionadas con temporizadores en segundo plano, como ngx.timer
, son operaciones asíncronas.
En cuanto a no bloqueante, que es un concepto que se confunde fácilmente con asíncrono, cuando decimos bloqueante aquí, nos referimos a bloquear el hilo del sistema operativo. Sigamos con el ejemplo anterior, asumiendo que toma 1s
consultar MySQL. Si dentro de este 1s
, los recursos del sistema operativo (CPU) están inactivos y esperando tontamente el retorno, eso es bloqueante; si la CPU aprovecha para procesar otras solicitudes de conexión, eso es no bloqueante. No bloqueante es también la clave para lograr altas concurrencias como C10K y C100K.
El concepto de sincronización no bloqueante es esencial. Sin embargo, en mi opinión, este concepto no debería entenderse por analogía porque una analogía inapropiada probablemente te confundirá aún más.
En OpenResty, el pseudocódigo anterior puede lograr directamente la sincronización no bloqueante sin palabras clave explícitas. Aquí se refleja nuevamente que facilitar el uso a los desarrolladores es uno de los conceptos de OpenResty.
Dinamismo
Una gran ventaja de OpenResty, que no ha sido completamente explotada, es su dinamismo.
Los servidores web tradicionales, como NGINX, requieren que modifiquemos el archivo de configuración en el disco y lo recarguemos para que surta efecto si ocurre algún cambio, ya que no proporcionan API para controlar el comportamiento en tiempo de ejecución. Por lo tanto, en microservicios que requieren cambios frecuentes, NGINX ha intentado muchas veces, pero no ha mejorado nada. Y la aparición repentina de Envoy, con la API de control dinámico de xDS, representa una gran amenaza de ataque de reducción de dimensionalidad para NGINX.
A diferencia de NGINX y Envoy, OpenResty está controlado por el lenguaje de scripting Lua, y el dinamismo es una ventaja natural de Lua. Por ejemplo, a través de la API Lua proporcionada en el módulo lua-nginx-module
en OpenResty, podemos controlar dinámicamente rutas, upstreams, certificados SSL, solicitudes, respuestas, etc. Incluso más allá, podemos modificar la lógica de procesamiento del negocio sin reiniciar OpenResty, no limitado a la API Lua proporcionada por OpenResty.
Aquí hay una excelente analogía para ayudarte a entender lo que se ha dicho sobre el dinamismo anteriormente. Piensa en un servidor web como un automóvil que va a toda velocidad en la autopista, NGINX necesita detenerse para cambiar los neumáticos y el color de la pintura; Envoy puede cambiar los neumáticos y los colores mientras está en movimiento; y OpenResty, además de las capacidades anteriores, también puede convertirse en un SUV sin detenerse.
Después de dominar esta habilidad mágica, el círculo de competencia e imaginación de OpenResty se ha expandido a otros campos, como Serverless y Edge computing.
¿Qué se debe aprender?
Después de hablar de tantas características clave de OpenResty, ¿qué deberíamos aprender? Prefiero centrarme en la línea principal en lugar de agarrar las cejas y las barbas para que podamos construir un sistema de conocimiento con un contexto claro.
Debes saber que no importa cuán completo sea un curso, es imposible cubrir todos los problemas y no puede ayudarte directamente a resolver cada error y excepción en línea.
Volviendo al estudio de OpenResty, en mi opinión, si quieres aprender bien OpenResty, deberías entender los siguientes ocho puntos clave:
- Modelo de programación sincrónico no bloqueante
- Papel de las diferentes fases de Solicitud/Respuesta
- Diferencias entre LuaJIT y Lua
- API de OpenResty y bibliotecas circundantes
- Corrutinas y cosockets
- Marco de pruebas unitarias y herramientas de pruebas de rendimiento
- Gráfico de llamas y cadena de herramientas circundante
- Optimización de rendimiento
Esos puntos son esenciales en nuestro estudio, y los discutiré por separado en cada capítulo. Sin embargo, en el proceso de aprendizaje, espero que puedas sacar inferencias de un caso y leer algunos capítulos en profundidad según tus intereses y antecedentes.
Si eres un principiante con OpenResty, puedes seguir el progreso del curso, instalar OpenResty en tu entorno y ejecutar y modificar el código de ejemplo. Recuerda, tu enfoque está en construir el panorama general de OpenResty, no en aferrarte a un solo punto de conocimiento. Por supuesto, si tienes alguna pregunta, no dudes en contactarnos en el chat en vivo.
Si estás utilizando OpenResty en tu proyecto, ¡eso es genial! Sin embargo, creo que cuando leas los capítulos sobre LuaJIT y optimización de rendimiento, tendrás más resonancia y aplicaciones prácticas y verás la mejora de rendimiento antes y después de la optimización en tu proyecto.
Además, si deseas contribuir con código a OpenResty y las bibliotecas circundantes, el mayor umbral no es entender los principios de OpenResty o cómo escribir módulos C de NGINX, sino los casos de prueba y las especificaciones de código. He visto a demasiados contribuyentes de OpenResty (incluyéndome a mí mismo) modificando repetidamente casos de prueba y estilos de código en un PR, y hay demasiadas reglas no escritas. Por lo tanto, las secciones de especificación de código y pruebas unitarias del curso son para ti.
Y si eres un ingeniero de QA, incluso si no usas OpenResty, el marco de pruebas y el conjunto de herramientas de análisis de rendimiento de OpenResty te darán mucha inspiración. Después de todo, la inversión y acumulación de OpenResty en pruebas son bastante profundas.