Ejercicio de diseño de arquitectura de Software

Haremos un diseño de arquitectura tomando como ejemplo un cine de color azul

Unos meses atrás, comencé a ir al cine nuevamente (considerando las precauciones que con esto conlleva), y durante mi experiencia, quise utilizar la aplicación y el sitio web de un cine muy grande de México. Sin embargo, la experiencia me resultó desastrosa desde mi perspectiva de cliente final, por lo que hoy, trataremos de diseñar una arquitectura que sirva como base para escalar un negocio similar

Aclaración: no tengo información sobre el tráfico que tienen en su sistema o de los retos específicos que podrían estar enfrentando. Por lo que para cada ángulo que tengamos, habrá que justificar la existencia de los componentes propuestos

También, es muy importante mencionar que no hay una solución infalible. Cada problema es totalmente distinto, y es posible que, la suma de tecnologías, librerias y frameworks no actualizados, mal manejo de proyecto o prioridades, o necesidad de integración con sistemas legados podrían llevar a una mala experiencia de usuario

Problemas

Búsquedas

Las búsquedas son muy importantes y podrían representar un módulo muy usado en nuestro sistema, ya sea para la indexación del sitio, o simplemente porque es donde gran parte de la base de nuestros usuarios pasarán. Así que es necesario tener una experiencia aceptable para maximizar las oportunidades de conversión de venta

SEO

Las búsquedas no existen únicamente por parte de los clientes finales, gran parte del tráfico puede venir de robots (bots) que realizan el indexado del sitio, por ejemplo, en Google. Al proceso de optimización para el posicionamiento del sitio en los buscadores es conocido como SEO

Para nuestro caso, como los cines pueden existir en distintas ciudades (o incluso tener varios en la misma ciudad), es necesario generar un indice principal que permita navegar al bot por ciudades, y éstas redirigirlas a las paginas de "cartelera" de dicha ciudad

Búsquedas y filtros

Las búsquedas necesitan la capacidad de filtrarse por:

  • Ciudad
  • Cine (código o nombre)
  • Tipo de sala - por ejemplo, si en un mismo cine tenemos 3D, 4D, VIP, etc.

Entonces, el mismo requerimiento sugiere que tenemos la necesidad de utilizar facetas, por lo que es utilizaremos un motor o plataforma de búsquedas, estas soluciones son optimizados para realizar las búsquedas por facetas, texto, difuso, etc.

Aquí pueden encontrar un ejemplo más desarrollado acerca de este punto

En la descripción de la arquitectura, esto quedaría de la siguiente forma:

API se comunica con SearchEngine

Tiempos

Carga de contenido

Considerando que la aplicación servirá una gran cantidad de contenido variable (videos, galerías de imágenes, etc.), es necesario aplicar ciertas estrategias:

  • Transformación de imágenes en distintos formatos/tamaños - Esto ayudará para cargar las imágenes de forma óptima: thumbnails para resultados de búsquedas, imágenes de mediano tamaño para la vista de la película, imagen de alta resolución para vista de lupa al seleccionar un elemento de la galería
  • Imágenes adaptables/responsivas - Con HTML, podemos indicar cuales son los recursos que debemos cargar dependiendo del tamaño de la pantalla en la que se encuentra renderizado nuestro sitio
  • Carga diferida de imágenes - Básicamente, cargar únicamente las imágenes que se encuentran a la vista del usuario
  • Utilizar un Red de Entrega de Contenido (CDN, por sus siglas en ingles) - Esto distribuirá el contenido multimedia (o estático como CSS, por ejemplo) en distintas regiones geográficas para que sea accedido por los servidores más cercanos al cliente

En fin, para este tema, existe una gran cantidad de estrategias que podríamos considerar, pero estas son las que tendremos para la primera iteración de nuestra aplicación

CDN para distribución del frontend y contenido multimedia

Llamados al backend

Esta parte es un tanto compleja, ya que, muchas cosas pueden fallar, pero en término de integraciones: llamados al search engine, BD o cualquier otra integración con un servicio tercero

Aquí, el primer paso para mejorar el rendimiento es utilizar distintos niveles de caching. Inicialmente, sugerimos comenzar con:

  • Caching a nivel de API - Podríamos darle un tiempo de vida (TTL, por sus siglas en inglés) alto a la información principal de las películas, ya que dicha información seguramente se mantendrá igual a lo largo de su existencia (titulo, cast, descripción, fecha de lanzamiento, etc.)
  • Caching a nivel de aplicación - Hay ciertos accesos a la BD que podemos reducir ya que, si bien la informacion puede cambiar, no cambia con una frecuencia alta
API con caché

En general, cualquier información que provenga de una fuente externa al componente del API puede potencialmente estar en su propia región de caché, por lo que podríamos incluir resultados de búsquedas, o los ascientos disponibles, aunque estos ultimos, con un TTL muy corto

De igual forma, para evitar posibles ataques, podemos incluir un firewall frente a nuestros APIs, de tal forma que podemos protegernos y reducir el riesgo de ataques (por ejemplo, de scalping)

Arquitectura con firewall y cache

Adicionalmente, el componente ilustrado como API puede ser decompuesto en una serie de micro servicios, los cuales tendrán que ser accedidos por un administrador de APIs

API Management y APIs

Componentes administrativos

Aplicaciones de backoffice

Para el caso de las aplicaciones de backoffice (administración) de la plataforma, es mejor separarla de la aplicación que se sirve a nuestros clientes finales (web/mobile), de tal forma que ese tráfico interno (por menor que pudiera ser) no genere ruido en nuestros componentes críticos

Esta aplicación puede ser incluso un monolito para esta primera iteración

Para manejar la seguridad del acceso al backoffice, es mejor restringir el acceso mediante un tunel VPN, adicional al control de roles y usuarios dentro de la aplicación misma

Aplicacion administrativa

Cronjobs (tareas programadas)

Las tareas programadas o que deben ocurrir de manera asíncrona (verificaciones de cobros, disparos de notificaciones, indexacion de los catálogos, etc.), pueden estar en su propia aplicación, accediendo a la BD y escuchando distintos eventos emitidos por el resto de los servicios (APIs de cara al cliente, aplicaciones administrativas, etc.)

Componente para tareas en segundo plano

Conclusiones

Una vez mencionados todos los puntos anteriores, vemos que los sistemas de eCommerce cuentan con un nivel de complejidad elevada. Incluso pensar en un MVP de infraestructura, termina con un sistema complejo con distintos componentes

Finalmente, en esta propuesta, sugerimos el uso de micro-servicios como primera alternativa, justificada por el hecho de que, distintos componentes del sistema cumplen diferentes propósitos y seria mejor desacoplarlos para poder crecer horizontalmente de forma atómica sobre los elementos que lo necesiten, aumentando la flexibilidad de la solución

Carlos Jose Martinez Arenas

Carlos Jose Martinez Arenas

Enamorado de la tecnología, con interés en machine learning, código limpio, buenas prácticas y arquitectura de sistemas; música y cine; naturaleza, espacios abiertos y los perritos