Premio DevProject: Mi discurso en DeveloperWeek 2019

Hola a todos


Me llamo Dmitry Golev. Soy el fundador y director técnico del Grupo Veliov. Hoy hablaré sobre el servicio que recibió el premio "Proyecto Dev" de DeveloperWeek . En esta ocasión, fuimos invitados a hablar sobre el proyecto de la escena DevExec World , a continuación hay una versión de texto de mi discurso.


logotipo de ostr.io


Como puede adivinar por el logotipo, estamos enfocados en el desarrollo web y JavaScript. El objetivo del servicio es reducir el costo del servicio de API, sitios web, aplicaciones web progresivas (PWA) y soluciones web en servidores Linux.


La mayoría de los proyectos web comienzan con un nombre de dominio. El nombre de dominio tiene registros Whois y DNS, y desde la era de HTTP / 2 ahora, la comunicación entre el servidor y el navegador del usuario debe estar encriptada y se requiere SSL para esto, o más correctamente, un certificado TLS.


Supervisamos continuamente la integridad de los datos del nombre de dominio (Whois, DNS, SSL / TLS) y supervisamos la fecha de vencimiento del certificado y el dominio. Las notificaciones de todos los cambios en los datos y las próximas fechas de vencimiento de los dominios y certificados pueden enviarse por SMS o correo electrónico.


Creemos que este servicio es una excelente manera:


  1. detectar rápidamente el acceso no autorizado y los cambios;
  2. eliminar errores al configurar un nombre de dominio, reemplazar un certificado y actualizar registros DNS.

Panel de dominio


El panel de control de nombre de dominio ( arriba ), un ejemplo de notificaciones de cambios en DNS, certificado SSL / TLS y Whois ( abajo ):


Ejemplo de notificaciones de cambios en DNS, certificado SSL / TLS y Whois


Los miembros de su equipo pueden personalizar las notificaciones de acuerdo con su área de responsabilidad:


Notificaciones personalizadas


Llamamos a este servicio " protección básica de nombres de dominio " y lo hicimos siempre gratuito para todos los usuarios en todos los planes de tarifas. Creemos que esto salvará a muchos usuarios de situaciones como:


  1. redirección de tráfico;
  2. MitM;
  3. sustitución de certificados;
  4. Secuestro de DNS;
  5. robo de un nombre de dominio y otras situaciones muy desagradables.

Resolvemos el problema del propietario de un nombre de dominio cuando no es posible controlar los registros, ya que esto debe hacerse con mucha frecuencia, incluso por la noche; esta es simplemente una tarea imposible para una persona.


¿Puedo confiar en los servicios donde se compró el nombre de dominio? En la mayoría de los casos, los servicios de DNS no tienen notificaciones de cambios realizados en los registros, y la única notificación de los registradores sobre el vencimiento de un nombre de dominio puede caer en el correo no deseado y pasar desapercibida. Un raro editor y distribuidor de certificados SSL / TLS envía notificaciones sobre la necesidad de volver a emitir el certificado, por lo que llegamos a la conclusión de que los registros y el certificado deben verificarse con frecuencia y automáticamente. Inicialmente, era un servicio interno que ahora está disponible para todos .




Pre-renderizado


Pre-renderizado (pre-renderizado)


El producto de servicio más popular es la representación previa . Si alguna vez ha tenido la suerte de escribir aplicaciones web en Angular, React, Vue, Blaze o cualquier otra biblioteca "cliente", puede notar cuán diferente es la respuesta del servidor de las páginas cuyo código HTML se genera en el servidor. Las aplicaciones web basadas en bibliotecas "cliente" tienen el marcado HTML mínimo necesario, sin datos ni plantillas.


Paquete de cliente


Las aplicaciones web modernas extraen de forma dinámica o " progresiva " el código, las plantillas y sus datos en partes del servidor. Lo que se cargará desde el servidor lo decide el propio "cliente" ( navegador, dispositivo ), dependiendo de las acciones del usuario, la página abierta ( "ruta", ruta ) y las necesidades funcionales. Hoy llamamos a estas aplicaciones la Progressive Web App (PWA).


Pros y contras de PWA


Como puede ver en esta diapositiva, los PWA tienen muchas ventajas y un gran inconveniente: la falta absoluta de optimización SEO.


Si bien la formación de páginas HTML en el servidor no es un requisito previo para trabajar en el navegador del usuario, las llamadas arañas y bots (rastreadores, arañas y bots) no ejecutan el JavaScript de la página visitada. Para que su sitio aparezca en los resultados de búsqueda (Google, Bing, Yandex, etc.), mensajería instantánea, redes sociales (Skype, Facebook, Twitter, iMessage, vk.com, etc.) y en la mayoría de las aplicaciones y servicios, donde puede enviar o publicar un enlace; necesita encontrar una manera de transferir el código HTML generado como resultado de la ejecución de JavaScript "cliente".


Integre el renderizado previo en menos de una hora


Si ahora se enfrenta a la pregunta "¿Cómo proporcionar SEO para una aplicación basada en una solución JavaScript del lado del cliente?", Tiene dos formas: implementar / integrar " Representación del lado del servidor / SSR " invirtiendo más tiempo y recursos en el desarrollo o use un servicio de representación previa de terceros.


La representación previa es como un SSR, sin escribir código


Como funciona Como proxy, filtramos las solicitudes que provienen de los robots y las redirigimos al motor de preprocesamiento, donde se solicitará la página y se ejecutará su JavaScript como se habría ejecutado en el navegador del usuario.


¿Cómo funciona la representación previa?


Resultados de la aplicación web con pre-renderizado:


Pre-renderizado en el messenger
Vista previa de enlaces en el messenger


Pre-renderizado en redes sociales
Vista previa de enlaces en redes sociales


Pre-renderizado en buscadores
Vista previa, descripción, metadatos y enlaces de sitio en los resultados del motor de búsqueda


Soporte ES6 / 7
Somos los primeros en presentar el soporte ECMAScript 6/7.


Puede obtener más información sobre la representación previa en prerendering.com




Monitoreo de API, sitios y servidores.


Monitoreo


El segundo producto más popular del servicio es el monitoreo de aplicaciones web, API y servidores Linux a través del protocolo SNMP.
Un servicio de monitoreo de terceros es una solución excelente, ya que usted y su equipo no necesitan instalar, actualizar, mantener, invertir recursos y tiempo en el desarrollo y "finalización" del monitoreo.


Cronología de respuesta del servidor


Para asegurarnos de que su aplicación web funcione y sea accesible para los usuarios, verificamos el código de respuesta, los encabezados, el cuerpo de la respuesta y la rapidez con que se recibió la respuesta.


Monitoreo de Nginx


Lo anterior es un ejemplo de monitoreo de un punto final con datos generados dinámicamente, todo lo que necesita es devolver XML, JSON o simplemente Number, y también puede configurar notificaciones incluso si los valores son demasiado altos, bajos o no cumplen con sus criterios.


Panel SNMP


Arriba hay un ejemplo de monitoreo de un servidor Linux a través del protocolo SNMP. SNMP es un estándar de la industria para leer datos de varios sensores de hardware y el sistema operativo, incluidos los servidores Linux, que se utilizan para servir aplicaciones web modernas. Para evitar el acceso no autorizado a sus servidores, el servicio le notificará sobre cada conexión SSH recientemente establecida.


Notificaciones de conexión SSH


Obtenga más información sobre el servicio de monitoreo en snmp-monitoring.com .




Analítica web


Analítica web


El tercer producto de servicio más popular es Web Analytics . Una vez que trabajamos en una aplicación con mucha animación, nuestros diseñadores se tomaron mucho tiempo para suavizar la animación. Todo estuvo bien y completamos la tarea, proporcionando una animación aceptable en todos los dispositivos y navegadores populares. Más tarde, el cliente estableció una pequeña tarea: agregar el código de análisis. Esta fue una de las soluciones populares que recopiló una gran cantidad de datos sobre el usuario, incluida la posición del cursor y el desplazamiento de la página para compilar un mapa de calor de la página. Dado que JavaScript tiene un tiempo de ejecución de subproceso único (Web Workers y Service Workers no cuentan), y los análisis tomaron una parte significativa de los recursos de la CPU para rastrear todas las acciones de los usuarios, esto destruyó todo nuestro trabajo dirigido a una animación fluida en dispositivos móviles y de bajo presupuesto. Así que se nos ocurrió la idea y la primera implementación de un análisis web fácil de entender, en tiempo real, confidencial y compatible con GDPR con código 100% abierto y un procedimiento simple sin seguimiento para el usuario final.


Recopile e informe todos los errores de JavaScript


Una de las principales características de la analítica web es la recopilación y organización automática de un informe sobre todos los errores del tiempo de ejecución de JavaScript ( errores de tiempo de ejecución y excepciones ) en tiempo real. Si está involucrado en el desarrollo web, sabe lo importante que es probar diferentes combinaciones de dispositivos y navegadores en diferentes versiones, pero cubrir el 100% de las combinaciones es simplemente físicamente imposible. En este mismo momento, sus usuarios son los propietarios de los dispositivos en los que es necesario realizar pruebas. Web Analytics recopila automáticamente todos los errores y excepciones ( errores, excepciones de tiempo de ejecución ) del tiempo de ejecución de JavaScript. Cada informe de error va acompañado de una descripción, archivo, línea y símbolo en el archivo, seguimiento de la pila (si corresponde), dispositivo, navegador, sistema operativo y sus versiones.


Análisis web compatible con vue.js react.js meteor.js angular.js y otras soluciones front-end de javascript


Una lista completa de productos disponibles e información más detallada está disponible en ostr.io. Todas las cuentas nuevas reciben un suministro único de "préstamos" ( nivel gratuito ), esto permite implementar servicios de integración y prueba de forma gratuita.




La infraestructura


La infraestructura


La parte más interesante es la infraestructura de servicio. Actualmente, se necesitan diecisiete servidores para cubrir las necesidades del servicio. Todos los productos y sus unidades se implementan como microservicios y cada microservicio se aloja en un servidor físico. Todos los servidores son copias idénticas entre sí. Antes de cada implementación y cambios en el servidor de prueba, todo el procedimiento se clasifica por pasos y se ejecuta en un script bash, luego el script se envía a GitHub, desde donde será recibido y lanzado por otros servidores. Cada servidor contiene una copia del código de la aplicación, microservicios, Nginx y MongoDB ( gracias a las réplicas ), este esquema nos permite soportar ataques, sobrevivir a las pruebas fallidas y da tiempo para resolver el problema. El servicio estará disponible para los usuarios incluso en el caso de una caída al 93% de la infraestructura, esto, por supuesto, puede afectar la velocidad de respuesta, pero permite que esté dentro del marco del SLA.


Para una distribución de carga uniforme entre todos los servidores, utilizamos dos niveles de equilibrio de DNS round-robin ( en nuestro caso, CloudFlare ) y nuestros propios servidores, en los que está instalado HAProxy .




paquete josk NPM


Josk


Como puede ver en la descripción anterior, tenemos muchos eventos recurrentes, por ejemplo, para monitorear servidores, API, Whois, DNS y otros puntos finales, debemos enviarles una solicitud regularmente y sin interrupciones. Para garantizar la continuidad de las tareas periódicas, creamos nuestra red descentralizada de muchos servidores, por lo que siempre sabemos que hay un servidor gratuito para realizar tareas. Tan pronto como las solicitudes superen las capacidades actuales, podemos agregar fácilmente la cantidad necesaria de nuevos servidores, gracias al esquema descrito anteriormente, por la simplicidad del escalado horizontal.


En las etapas iniciales, las capacidades de nuestros servidores excedieron significativamente las necesidades actuales, como resultado, nos encontramos en una situación en la que dos o más servidores gratuitos realizaron la misma tarea en paralelo. Esto amenazó en gran medida el desarrollo posterior, ya que el servicio podría enviar muchas cartas idénticas a un usuario o enviar docenas de consultas DNS desde nuestras direcciones IP, lo que amenazaba con una prohibición.


Para resolver rápidamente este problema, se nos ocurrió un desincronizador de tareas, que proporcionaba una garantía del 95% de que la tarea asignada en la cola se ejecutará una vez y en una unidad de tiempo. Más tarde publicamos el código del desincronizador como un paquete NPM y lo josk . Si está interesado en mirar debajo del capó, aquí hay un enlace a GitHub .




paquete NPM de tiempo de correo


tiempo de correo


La misma razón nos llevó a crear mail-time que le permite enviar cartas desde una infraestructura multiservidor. El paquete está escrito sobre la base de josk , organiza cartas en una cola y las envía desde una infraestructura multiservidor. Además del envío de correos, mail-time permite dividir microservicios en:


  1. "clientes" ( client ), que solo agregan letras a la cola;
  2. "servidor" ( server ), que crea un microservicio independiente para realizar solo dos tareas: administrar la cola de cartas y su distribución.

Esta no es la única característica única de la biblioteca, para obtener detalles y una descripción más detallada de todas las características, lea la documentación .


Desafortunadamente, por el momento, ambos paquetes ( josk y mail-time ) requieren MongoDB como base de datos (DB) para la cola y la desincronización. Estamos listos para desarrollar ambas bibliotecas y felizmente discutiremos y adoptaremos PR para agregar soporte para otras bases de datos. Por nuestra parte, Redis parece un gran candidato para la integración.


Muchas gracias a todos los que leyeron hasta el final. Si estaba interesado, haga preguntas y escriba en la LAN y si hay interés de los lectores, estoy listo para hablar sobre la experiencia de participar y hablar en otros eventos sobre desarrollo web, node.js y JavaScript.


Todos los que estén interesados ​​en aprender sobre ostr.io, usar el servicio, obtener un código promocional, descuentos o respuestas a preguntas, escríbanme en el PM o en las redes sociales. El soporte ostr.io solo habla inglés, pero responde muy rápido, por ejemplo, a través del FB messenger .

Source: https://habr.com/ru/post/443114/


All Articles