Cómo aprender a relajarse con la postura correcta
A diferencia de la mayoría del software de código abierto conocido nacido en Europa y Estados Unidos, el propio OpenResty y los principales componentes en los que se basa fueron inventados por desarrolladores de los países BRICS, lo cual es bastante interesante.
Nginx fue inventado por los rusos, Lua fue inventado por varios profesores brasileños y el chino Zhang Yichun incorporó LuaJITVM en Nginx para realizar una solución de servidor de alto rendimiento como OpenResty.
A través de OpenResty, varias funciones de nginx se pueden unir libremente. Más importante aún, el umbral de desarrollo no es alto y todo está controlado por el potente y liviano lenguaje Lua.
Los principales escenarios de uso son:
Combinación y procesamiento de varias salidas ascendentes de nginx (proxy, Postgres, Redis, Memcached, etc.) en Lua.
Lua es libre de realizar controles de acceso complejos y comprobaciones de seguridad antes de que la solicitud llegue al servicio ascendente.
Siéntete libre de manipular la información en los encabezados de respuesta.
Obtenga información de backend de servicios de almacenamiento externos (como Redis, Memcached, MySQL, Postgres) y utilice esta información para seleccionar a qué backend completar el acceso empresarial en tiempo real.
Escriba cualquier aplicación web compleja en el controlador de contenido para acceder a bases de datos back-end y otros tipos de almacenamiento de forma sincrónica pero sin bloqueos.
En la fase de reescritura, se completa un envío de URL muy complejo a través de Lua.
Lua se puede utilizar para implementar subsolicitudes de nginx y mecanismos de almacenamiento en caché avanzados en cualquier ubicación.
Antes de organizar la Conferencia de Tecnología OpenResty, siempre pensé que era un usuario solitario de OpenResty y sentía que estaba usando una tecnología impopular.
Aunque todo el mundo ha oído hablar de OpenResty o ngx_lua, parece que rara vez se utilizan en entornos de producción. A excepción de algunas empresas de CDN, no parece haber oído hablar de ninguna empresa de Internet conocida que lo utilice. El uso de la industria CDN está influenciado por la pila de tecnología Cloudflare, y el autor de OpenResty también es una empresa CDN extranjera.
Pero después de esta conferencia, descubrí que realmente hay muchos usuarios. El equipo de servidores de Qihoo 360 lo está utilizando, al igual que JD.COM, Baidu, Meizu, Zhihu, Youku, Sina y otras empresas de Internet. Algunos se utilizan para escribir WAF, programación CDN, sistemas de publicidad y sistemas de envío de mensajes, y algunos, como nuestro departamento, se utilizan como servidores API. Algunos de ellos también se utilizan en negocios muy críticos, como la página de detalles del producto JD.COM compartida por Tao Kai en la arquitectura de alta disponibilidad. Esta es la aplicación más grande de ngx_lua que conozco.
2. Criterios de selección de tecnología de Qihoo Enterprise Security Server
Permítanme hablar primero sobre por qué elegí OpenResty cuando estaba tomando decisiones de arquitectura hace más de tres años.
De hecho, no importa cómo esté diseñada la arquitectura, porque cada empresa y cada equipo tiene una cultura corporativa y una formación técnica diferente, y copiarlo mecánicamente será contraproducente. Lo que importa es por qué lo elegiste en primer lugar y por qué hiciste ajustes a mitad de camino.
Nuestro producto requiere una máquina independiente y el servidor proporciona una interfaz API de alto rendimiento. QPS es de al menos 10.000 y debe soportar más de 654,38 millones en el futuro. No tenemos prisa por utilizar PHP, Python u otros lenguajes para implementar funciones, pero primero dibujamos un modelo técnico idealizado.
El modelo debe tener:
Acceso sin bloqueo a la red IO. Al conectarse a MySQL, Redis e iniciar solicitudes HTTP, el proceso de trabajo no puede esperar el regreso de la E/S de la red, sino que debe estar controlado por eventos para que los recursos de la CPU puedan manejar otras solicitudes de manera más eficiente de manera colaborativa. Muchos idiomas no tienen tales capacidades ni bibliotecas periféricas.
Existe un mecanismo de almacenamiento en caché completo. No sólo necesita admitir cachés externos como Redis y Memcached, sino que también debe tener un sistema de almacenamiento en caché en su propio proceso. Esperamos que la mayoría de las solicitudes puedan obtener datos y devolverlos en un solo proceso, que es el método más eficiente. Una vez que se produce la E/S de la red y la interacción entre procesos, el rendimiento se verá muy afectado.
Escriba la lógica del código de forma sincrónica y no permita que los desarrolladores perciban devoluciones de llamada y asincronía.
Esto también es importante. Los programadores también son seres humanos y el código debería estar más en consonancia con los hábitos de pensamiento humanos. Las devoluciones de llamada explícitas y las palabras clave asincrónicas pueden interrumpir ideas y dificultar la depuración.
Es mejor apoyarse en gigantes y aprovechar tecnología madura. Adoptar un lenguaje y una tecnología completamente nuevos requiere pasar por el dolor de ajustes frecuentes durante el período de desarrollo del lenguaje en sí, y es posible que usted esté en el lado equivocado.
No solo es compatible con la plataforma Linux, sino que también es compatible con la plataforma Windows, lo cual es un requisito muy especial para nuestros productos. Muchos usuarios de pequeñas y medianas empresas todavía están acostumbrados a las operaciones de Windows y no tienen las capacidades de mantenimiento de Linux.
Basándonos en las consideraciones anteriores, examinamos algunas soluciones en ese momento y elegimos OpenResty.
En primer lugar, su característica más importante es el uso de lógica de código síncrono para implementar llamadas sin bloqueo. En segundo lugar, tiene LRUcache dentro de un solo proceso y shareDICTcache entre procesos, que es una mezcla de nginx y LuaJIT. Y nginx tiene una versión para Windows. Aunque existen muchas limitaciones, estas limitaciones se pueden solucionar. Las funciones que no son compatibles con la versión oficial de nginx para Windows se han resuelto en nuestra versión de código abierto.
La primera vez que vi una solución de este tipo, sentí que definitivamente subvertiría el desarrollo de servidores de alto rendimiento. ¿Por qué? Mi empresa anterior tenía casi 10 mil millones de solicitudes de consulta todos los días y solo usaba diez servidores.
Utilizamos el módulo nginxC integrado nginx (de desarrollo propio) + base de datos K-V para implementar toda la lógica empresarial para lograr este objetivo. Suena simple, pero el proceso es difícil. Fueron necesarios dos o tres expertos con más de diez años de experiencia laboral para decidirse durante más de un año. La mayoría de ellos carecen de capacidad de desarrollo y sólo pueden quedarse atrás. Además, la depuración y el mantenimiento posteriores también consumirán mucha energía.
Pero la aparición de OpenResty lo cambió todo. OpenResty es muy poético y adecuado para el pensamiento humano normal. Después de uno o dos meses de aprendizaje, la API creada por un novato puede alcanzar el rendimiento del módulo nginxC, la cantidad de código se reduce considerablemente y es fácil de depurar.
3. Tomando como ejemplo a Qihoo y Sina, ¿cómo introducir nuevas tecnologías en los proyectos?
La selección de tecnología es sólo el primer paso. ¿Cómo introducir OpenResty en un producto o proyecto? Déjame mostrarte los casos reales de Qihoo Enterprise Security y Sina Mobile. Zhou Jian de Sina Mobile y yo estamos en un departamento con productos maduros. Con el poder de una o dos personas, reemplazamos el marco técnico original con una nueva tecnología. Sin embargo, debido a las diferencias entre productos empresariales y productos personales, los métodos también son muy diferentes.
Primero hablemos de los problemas de seguridad de Qihoo Enterprise donde trabajo. Se incorporó a este departamento a principios de 2012. En ese momento, el producto principal era gratuito y los usuarios objetivo eran las pequeñas empresas. Por lo tanto, en términos de diseño arquitectónico, solo consideramos docenas o cientos de solicitudes de terminal, utilizamos tecnología de plataforma Windows muy vinculada y tendemos a crear un nuevo marco más adecuado para nosotros sin software de código abierto. Incluyendo un servidor web desarrollado en C++, enrutamiento PHP y un marco escrito por usted mismo, los datos se almacenan en sqlite.
Ayudé a corregir errores de PHP durante dos meses. Después de comprender la arquitectura técnica, comencé a trabajar en la nueva línea de productos. Este es un producto experimental, principalmente para empresas centrales y redes privadas. Hay millones de terminales en la red.
No mucha gente prestó atención al principio, así que adopté directamente los componentes de código abierto de Linux+OpenResty+Redis+Postgres. Antes de la prueba de rendimiento, eran n bloques. El último producto experimental y el producto anterior se fusionaron en un solo producto y la tecnología se dividió en dos conjuntos de arquitecturas. Las funciones antiguas utilizan una arquitectura antigua, las funciones nuevas utilizan una arquitectura nueva.
A medida que aumentan los usuarios, la arquitectura técnica original comienza a estirarse y aumenta la acumulación de deudas técnicas. Como se quejaron los usuarios, SQLite fue abandonado y reemplazado por Postgres. Pero el marco desarrollado por nosotros mismos sigue siendo algo contraproducente.
Durante este período, los estudiantes de desarrollo conocieron las ventajas de esta tecnología a través de pruebas comparativas, capacitación en OpenResty y múltiples encuestas sobre problemas de rendimiento del usuario. Los estudiantes de desarrollo que estaban abrumados por las horas extras eligieron gradualmente usar OpenResty en lugar de marcos de desarrollo propio para desarrollar nuevas funciones y migrar funciones antiguas para evitar las horas extras.
Cuando se reconfiguró el producto, el marco del servidor de desarrollo propio se abandonó por completo y el número de estudiantes que desarrollaban servidores se redujo de 8 o 9 a 3.
En el proceso de introducción de nuevas tecnologías, no tomamos medidas obligatorias porque los productos empresariales deben ser estables y la versión implementada por los usuarios se actualiza muy lentamente.
El enfoque de Sina Mobile en Zhou Jian tiene más sentido para todos. Sina Mobile se basó originalmente en Apache y usó PHP para manejar las solicitudes de los usuarios. Apache es un modelo multiproceso síncrono, por lo que no hay problema cuando no hay muchas solicitudes simultáneas.
Sin embargo, siempre habrá noticias inesperadas, como la desaparición de Malaysian Airlines y artículos descarrilados. El repentino alto tráfico abrumó el fondo varias veces. Y se puede predecir que el tráfico de la Copa del Mundo será muy grande, por lo que Zhou Jian reemplazó Apache con nginx y usó fast_cgi_cache de nginx. Después de unos meses, QPS se actualizó en un orden de magnitud.
La interfaz backend de Sina Mobile está implementada en PHP, lo que tiene algunas deficiencias en condiciones de alta concurrencia. El caché simple de Nginx puede cumplir con el rendimiento, pero no puede cumplir con los requisitos de refinamiento empresarial y coherencia de los datos. Necesitamos encontrar soluciones distintas a PHP, siempre que el desarrollo de PHP pueda resultar cómodo. La devolución de llamada de Node.js se va al infierno y la depuración de Go es inconveniente, todos los cuales son obstáculos.
Finalmente eligieron OpenResty y abrieron un marco web Vanilla basado en OpenResty, que imitó los hábitos de uso de Yaf e hizo que el desarrollo PHP fuera más fácil de aceptar y comenzar. Sina Mobile siempre ha utilizado Vanilla y algunos negocios principales, como gráficos y textos de alta definición, transmisiones deportivas en vivo, etc., están migrando a este marco.
4. Los puntos débiles de empezar y el método de aprendizaje correcto
Zhou Jian y yo comenzamos a cruzar el río solos. En ese momento, no había otra información excepto los artículos de uso de "tía" en la comunidad de Python.
Qihoo y Sina han reemplazado con éxito la tecnología anterior con OpenResty, pero el problema sigue siendo obvio, es decir, todos piensan que son usuarios solitarios y casi ninguno de sus colegas está de acuerdo. En términos de servicios clave y de soporte, algunas personas no confían en el uso de OpenResty e intentarán verificar los servicios perimetrales primero.
Aunque el rendimiento de OpenResty es muy bueno, comparable o mejor que el de todas las demás soluciones de alto rendimiento, el proyecto se ha visto obstaculizado por la preocupación de que no hay materiales de aprendizaje, ni contratación, ni comunicación, y que El autor Zhang Yichun renunciará algún día y será destruido.
Todos los miembros del grupo de arquitectura de alta disponibilidad son arquitectos y tomadores de decisiones técnicas. Sin duda, estos riesgos se tendrán en cuenta al introducir una nueva tecnología. Por ejemplo, la arquitectura de alta disponibilidad compartida por Ma Lichao de Xiaomi Technology. Usan ngx_lua en su sistema de compras urgentes. Aunque el rendimiento satisfizo las necesidades, pocas personas en el equipo estaban familiarizados con él, por lo que finalmente se cambió al lenguaje Go.
¿Cómo abordar estas preocupaciones? Ha habido algunas reflexiones y discusiones en la comunidad, de las que hablaremos al final del intercambio. En primer lugar, desde la perspectiva de un desarrollador que intenta utilizar esta tecnología, gran parte del trabajo básico de OpenResty no es lo suficientemente completo y amigable:
Solo se puede instalar desde el código fuente, sin apt-get. Brew y otro software Método de instalación del almacén. No existen herramientas de administración de paquetes como PIP y NPM para instalar bibliotecas de terceros. Primero debe ir a Google y luego copiar el archivo de código al directorio especificado antes de poder usar require.
La codificación requiere modificar nginx.conf y el código lua correspondiente, incluso para helloworld. Por supuesto, puede escribir el código en el archivo de configuración de nginx, pero el entorno de producción debe estar separado. Esta forma de escribir código es diferente de los lenguajes de programación y de los métodos de programación habituales.
Existe un concepto de fase de ejecución único. Debido a que OpenResty se basa en nginx, también hereda este concepto. Es posible que la lógica de su código deba ejecutarse en diferentes etapas para obtener las expectativas que desea. La forma de transferir información entre estas etapas y qué API no están disponibles en algunas etapas a menudo hacen que los principiantes se detengan.
Solo hay una manera de comunicarte cuando tienes problemas y la lista de correo está bloqueada. La documentación está sólo en inglés, lo que deja a muchos usuarios novatos sin poder resolver sus problemas.
No existe una forma sistemática de aprender OpenResty. La mayoría de ellos requieren comprender qué funciones la empresa necesita implementar en documentos y API. En cuanto a la forma correcta y si se puede optimizar, no lo sé.