Open IT Experts for Enterprise

Zylk empresa de desarrollo de ecommerce

Aplicaciones escalables de alto rendimiento

Gustavo Fernández
Gustavo Fernández

Hace un par de semanas acudí a la siguiente
charla
en la que la gente de linkedin presentaba su solución
de alto rendimiento para procesar información. Fue toda una alegría
ver que muchos de los conceptos explicados eran temas que en
zylk.net llevamos ya algún tiempo aplicando
.

  • Procesos desacoplados (Colas y Topics )
  • Websockets para poder desatender las peticiones
  • Base de datos, servicios de colas y de filesystem orientadas a un
    escalado horizontal (particionado y distribución de keys)
  • etc..

Así que voy a escribir una serie de artículos con las
técnicas más básicas para conseguir un rendimiento
alto en el desarrollo de nuevos servicios, basandonos
en estos conceptos y productos. La idea de diseñar de esta manera las
aplicaciones persigue los siguientes objetivos

  • Escalabilidad horizontal a bajo coste
  • Alto rendimiento
  • Tiempos de respuesta bajos

A continuación muestro una imagen de lo que podría ser un servicio de
este estilo a nivel general

Donde podemos ver la estructura a tres capas de siempre pero en la
que las siguientes técnicas nos permiten mejorar el rendimiento y la
esclabildiad del sistema

  1. En la capa inicial de comunicación entre el cliente y el servidor
    usamos dos técnicas diferentes usando los estándares que java ha
    definido a tal efecto

    1. WebSockets basados en HTML5 (jsr-365 para las
      peticiones que llegan al servidor)
    2. Peticiones a servicios rest asíncronos (jax-rs)
  2. En la capa de middle situamos un tomcat8 que implementa sus
    conectores http y ajp con las liberías NIO de java en esta parte es
    donde se implementan los servicios asícronos usando dos técnicas

    1. jax-rs asícrono, atendido o desatendido
    2. Servlets asíncronos, atendidos o desatendidos
  3. En la tercera capa simplemente están los productos que hemos
    mencionado

    1. Colas JMS vs Colas Kafka
    2. Filesystem distribuido basado en HDFS
    3. Sistema de almacenamiento
      particionado basado en HBase para datos semi estructurados

En un sistema clasico la petición iría del cliente al frontal web,
del frontal web al servidor de aplicaciones y del servidor de
aplicaciones al backend…y la respuesta realizaría el camino inverso.
Todo ello de manera síncrona. Por lo tanto la pendiente que
define la recta
que representa el numero de peticiones por
segundo respecto al numero de usuarios concurrentes depende de
la velocidad de una petición unitaria
(cuanto más rápida la
petición, más pendiente y más peticiones por segundo podrá resolver el
sistema, si lo consideramos como un sistema ideal que no tiene límites).

En cambio en un sistema desacoplado y desatendido el
número de peticiones que el sistema puede responder no depende de la
velocidad de respuesta de una petición unitaria…

Por tanto lo que nos interesa es

  1. Desacoplar las peticiones para que los recursos del
    frontal web y del middle se devuelvan lo antes posible al pool de
    peticiones de ambos servidores.
  2. Desatender las peticiones asíncronas (simpre que
    sea posible) para delegarlas en un sistema de colas y que no se
    colapse en ningún caso la capa intermedia ni la de backend. Además
    con este sistema podemos conseguir una expriencias de usuario mejor.
    El feedback de estos procesos se debería dar por
    medio de un sistema de websockets precisamente para
    poder realizar solicitudes desatendidas.

La idea es escribir tres artículos explicando (desde el punto de
vista de un desarrollador java) los siguientes puntos de la arquitecutra

  1. WebSockets
  2. JAX-RS asíncrono y Servlets asíncronos
  3. Colas en kafka

Y ahora un pequeño detalle técnico (dos pasos y dos lineas de
configuración)
  para el apache 2.4.7, necesario para que el
frontal pueda hacer de proxy a las peticiones websocket

  • (codigo fuente del módulo proxy de apache) svn co http://svn.apache.org/repos/asf/httpd/httpd/tags/2.4.7/modules/proxy/
  • (compliado del conector para websockets) sudo apxs2
    -aic -I /usr/include/libxml2 ./proxy/mod_proxy_wstunnel.c
  • (configuración de los slatos de apache para
    websockets)
    ProxyPass /Momo/websocket ws://hefesto.zylk.net:8080/Momo/websocket
  • (configuración de los slatos de apache para websockets)
    ProxyPassReverse /Momo/websocket ws://hefesto.zylk.net:8080/Momo/websocket

Si te ha parecido interesante comparte este post en RRS

Facebook
LinkedIn
Telegram
Email

Leer más sobre temas relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *