Arquitectura de la plataforma Lokad

La plataforma de Lokad es una solución SaaS alojada en la nube multiinquilino. Esta página presenta la arquitectura de alto nivel de la plataforma. Aunque la página está destinada a una audiencia de TI, un practicante de la cadena de suministro con conocimientos tecnológicos puede encontrar esta información interesante, ya que esta arquitectura refleja nuestra visión tecnológica para la optimización predictiva de las cadenas de suministro.

system-architecture

Resumen de la arquitectura

Lokad se presenta como un entorno para desarrollar y operar aplicaciones de optimización predictiva destinadas a problemas de cadena de suministro. En su núcleo se encuentra un lenguaje específico del dominio (DSL) llamado Envision, desarrollado por Lokad. Envision es accesible para los usuarios finales y la mayoría de las capacidades se entregan a través de él. Aunque Envision implica programación, Lokad está destinado a especialistas en cadenas de suministro, no a especialistas en TI o ingenieros de software.

La plataforma de Lokad es multiinquilino: la misma aplicación sirve a todos nuestros clientes e incluye una serie corta de servicios. La granularidad de la división está motivada principalmente por requisitos divergentes en términos de confiabilidad, seguridad y rendimiento de cada servicio, en lugar de por una división funcional pura. De hecho, el nivel de acoplamiento que existe entre estos servicios es relativamente alto. Estos servicios comparten el mismo repositorio de código Git y también se actualizan con frecuencia juntos.

Nuestro código está implementado en F#, C# y TypeScript con pocas dependencias de terceros más allá de .NET, un marco de código abierto desarrollado por Microsoft. Además, aparte de .NET en sí, tenemos muy pocas otras dependencias (aproximadamente un orden de magnitud menos que la norma).

Esta arquitectura difiere ampliamente de las arquitecturas “habituales” que se encuentran entre las aplicaciones empresariales, y por buenas razones. La aplicación empresarial común depende de dependencias pesadas y extensas; cada dependencia suele pesar más de 1 millón de líneas de código. Sin embargo, Lokad carece de dependencias de terceros en las siguientes áreas:

  • Base de datos relacional: En su lugar, utilizamos un almacén de eventos junto con un almacén direccionable por contenido.
  • Sistema de almacenamiento en caché: En su lugar, colocalizamos el cálculo y el almacenamiento transitorio.
  • Gestor de canalizaciones: En su lugar, tenemos nuestro propio programador (detallado a continuación).
  • Motor de análisis: En su lugar, nuestro DSL llamado Envision proporciona capacidades de análisis.
  • Kit de herramientas de aprendizaje automático: En su lugar, el DSL también proporciona capacidades de ML.
  • Kit de herramientas de visualización de datos: En su lugar, hemos implementado el nuestro, con una integración estrecha del DSL.

Cabe destacar que, aunque internalizamos ampliamente el desarrollo de nuestra plataforma, intencional y exclusivamente confiamos en componentes de terceros para todos nuestros componentes de seguridad, como algoritmos criptográficos.

El front-end

El front-end se refiere a los elementos accesibles para los usuarios finales, incluidos los agentes automatizados utilizados para mover datos hacia y desde Lokad. La mayoría de estas interacciones ocurren a través de un navegador web mediante HTTPS, aunque Lokad también admite los protocolos FTPS y SFTP para mover archivos.

go.lokad.com

Este servicio aloja React, el marco de front-end de la aplicación web de Lokad, implementado como una aplicación de página única (SPA). Este front-end depende de las API (interfaces de programación de aplicaciones) proporcionadas por los otros servicios.

Este servicio sirve exclusivamente contenido estático, principalmente JavaScript. No hay partes móviles del lado del servidor y, notablemente, no hay persistencia de datos. Este diseño es intencional ya que la disponibilidad es la mayor prioridad para este servicio; no importa qué servicio se acceda a través de la web, el servicio go.lokad.com debe estar disponible.

Paneles de control

El servicio de paneles de control, como su nombre lo indica, se encarga de renderizar los paneles de control analíticos web proporcionados por Lokad.

Cada panel de control es el resultado de un script ejecutado de Envision. Los paneles de control están extensamente precalculados, aunque también se ofrecen algunas capacidades interactivas. El diseño de Envision en sí mismo asegura que las interacciones del lado del cliente sigan siendo problemas de datos pequeños, sin importar el tamaño del conjunto de datos original.

Del lado del cliente, todos los datos necesarios para la primera renderización del panel de control se obtienen a través de una única solicitud HTTPS. Este diseño de una sola solicitud sirve para minimizar la sobrecarga de latencia. El empaquetado binario y la compresión minimizan el consumo de ancho de banda.

Del lado del servidor, los datos asociados con un panel de control dado son empaquetados por el almacén de contenido. Nuevamente, el empaquetado es esencial para mantener el número total de solicitudes de red muy bajo, normalmente por debajo de media docena, independientemente de la complejidad del panel de control.

Los paneles de control interactivos dan al usuario final la posibilidad de acceder a conjuntos de datos grandes, más allá de lo que sería posible transferir y mostrar a través de un navegador. Cambiar de una vista a la siguiente requiere como máximo una sola solicitud del lado del cliente (y muy pocas del lado del servidor).

Lokad vs mainstream

El diseño de tiempo de renderización constante de Lokad difiere de la inteligencia empresarial (BI) convencional y otras herramientas analíticas. Los paneles de control que se encuentran en tales herramientas están hechos inevitablemente de una lista de mosaicos, a veces llamados bloques o widgets. La forma estándar de lidiar con estos mosaicos implica 1 solicitud del lado del cliente por mosaico, seguida de un número no especificado/no garantizado de solicitudes del lado del servidor. Desafortunadamente, este diseño conduce a paneles de control lentos con un retraso notable para cada mosaico. Además, la visualización completa de todos los mosaicos del panel de control a menudo lleva varios segundos.

Lokad elimina este problema al hacer que el compilador de Envision produzca una estrategia de empaquetado de los datos utilizados para renderizar el panel de control, asegurando así tanto solicitudes de un solo dígito en el lado del cliente, como incluso menos en el lado del servidor. Desde nuestra perspectiva, el rendimiento de los paneles de control comienza en el tiempo de compilación, con scripts respaldando los paneles de control.

Además, la mayoría de las herramientas analíticas posponen una gran parte del cálculo hasta que se solicita un panel de control (a veces llamado informe). Desafortunadamente, el diseño también conduce inevitablemente a problemas de rendimiento cuando el número de usuarios finales concurrentes aumenta, ya que hay un conflicto inevitable por los recursos informáticos del lado del servidor que se mutualizan para servir a todos los usuarios finales.

Lokad mitiga ampliamente este problema al pre-calcular los paneles de control. Nuestro diseño minimiza los recursos del lado del servidor necesarios, a pedido del usuario final, para servir un panel de control, dejando al almacén de contenido como el cuello de botella principal (pero intencionado) para servir los datos de los paneles de control. Este diseño asegura que se puedan servir paneles de control a un gran número de usuarios finales de manera concurrente con una degradación mínima del rendimiento.

Proyectos

El servicio de proyectos gestiona scripts y trabajos por lotes (llamados secuencias). Este servicio cuenta con una jerarquía de proyectos. Los usuarios finales, que tienen los derechos de acceso adecuados, pueden ver, editar y ejecutar proyectos. Una aplicación de optimización predictiva personalizada implementada por Lokad típicamente incluye una lista de proyectos.

El almacenamiento de eventos se utiliza para persistir las entradas de usuario, aprovechando el almacén de eventos detallado aquí. Cada comando o interacción emitido al servicio se registra y se convierte en un evento resultante. La interfaz de usuario presenta el estado obtenido al recopilar todos los eventos. Este enfoque se conoce como un patrón CQRS+ES. CQRS significa Segregación de Responsabilidad de Comando y Consulta, mientras que ES significa Fuente de Eventos.

El patrón CQRS+ES proporciona por diseño una historización completa de todos los cambios introducidos en la aplicación. En el caso específico de Lokad, proporciona una versión similar a Git de todos los cambios aplicados a los scripts de Envision que existen dentro de la cuenta.

Lokad vs convencional

En términos de UI y UX, el servicio de proyectos sigue el enfoque convencional. Sin embargo, bajo el capó, se utiliza el patrón CQRS+ES como una alternativa al CRUD (crear, leer, actualizar, eliminar) utilizado para la mayoría del software empresarial. Este patrón reemplaza la base de datos relacional con un almacén de eventos (discutido a continuación).

El enfoque CQRS+ES ofrece muchos beneficios sobre el patrón CRUD. Por ejemplo, ofrece una semántica superior, una auditabilidad superior y, en el caso de Lokad, un rendimiento superior, ya que nos permite personalizar extensamente la estrategia de persistencia utilizada para almacenar y recuperar el código fuente de Envision. De hecho, la mayor parte de los datos que se deben persistir en el servicio de proyectos consisten en código fuente de Envision.

Código

El servicio de código cuenta con un IDE (entorno de desarrollo integrado) dedicado al lenguaje Envision. Este IDE basado en web tiene todas las características y funcionalidades esperadas de un entorno de desarrollo moderno, como el coloreado de código, la autocompletación y una serie de acciones de código (por ejemplo, cambio de nombre de variables), posibles gracias al análisis estático de código.

La mayor parte de la complejidad del servicio de código radica en su backend de servidor de lenguaje que proporciona retroalimentación en tiempo real: sugerencias para autocompletar, errores o acciones de código en cada pulsación de tecla. En particular, uno de los desafíos técnicos clave consiste en mantener una baja latencia para esta función, ya que los retrasos serían bastante notables al considerar el ritmo de las interacciones normales con el teclado.

Archivos

Cada cuenta en Lokad tiene su propio espacio para almacenar archivos. El servicio de archivos cuenta con un sistema de archivos distribuido versionado que se utiliza para gestionar sus archivos. Este sistema de archivos se puede acceder a través de una interfaz web y los protocolos SFTP y FTPS. Conceptualmente, este sistema de archivos es en gran medida similar a un repositorio de Git, excepto que está destinado para archivos planos de tamaño gigabyte.

La versión de archivos está garantizada a través del patrón CQRS+ES, que complementa la presentación de una secuencia de “commits”, reflejando la evolución del propio sistema de archivos. La persistencia del contenido de los archivos se asegura a través de un almacén de direcciones de contenido (discutido a continuación).

Al versionar tanto el código (scripts de Envision) como los datos, Lokad ofrece una reproducibilidad completa de los comportamientos pasados para las aplicaciones de cadena de suministro implementadas en su plataforma. Desde una perspectiva de cadena de suministro, esta capacidad es importante para asegurarse de que cada resultado anómalo generado por la aplicación de cadena de suministro se pueda solucionar.

Lokad vs convencional

El servicio de archivos está estrechamente integrado con el lenguaje Envision (proporcionando beneficios de corrección), el IDE de Envision (proporcionando beneficios de productividad) y el tiempo de ejecución de Envision (proporcionando beneficios de rendimiento). Estos beneficios serían difíciles de lograr con un sistema de archivos de propósito general, un componente de software que es ante todo un compañero del kernel.

Además, muchos de los beneficios del servicio de archivos se obtienen al hacer menos que un sistema de archivos de propósito general. Por ejemplo, el servicio de archivos no permite que un archivo sea actualizado concurrentemente por varios procesos. Tales características, en el contexto específico de las aplicaciones de cadena de suministro, solo exponen a los profesionales de la cadena de suministro a problemas y complejidades centrados en TI sin proporcionar valor a cambio.

Cuentas

La Gestión de Identidad y Acceso (IAM) del servicio de cuentas es una de las partes más convencionales de Lokad. Administra las cuentas de Lokad, los usuarios de Lokad, la autenticación (idealmente, autenticación delegada) y la ACL (Lista de Control de Acceso) que controla lo que los usuarios pueden o no pueden hacer con una cuenta de Lokad.

Este servicio también aprovecha el patrón CQRS+ES, que ofrece registros de auditoría completos de todas las operaciones de IAM, operaciones que siempre son sensibles a la seguridad debido a la naturaleza misma de IAM. El uso de la fuente de eventos como registro de auditoría también elimina clases enteras de problemas de seguridad, como que el registro de auditoría sea comprometido al no tener eventos seleccionados registrados en él.

La capa de persistencia

La capa de persistencia, como sugiere el nombre, asegura la persistencia de todos los datos gestionados por Lokad. Estos datos vienen en dos sabores distintos: primero, los archivos - ya sea subidos por los clientes a Lokad o generados a través de scripts de Envision; segundo, los eventos resultantes de las operaciones de los usuarios (incluidos agentes automatizados, como un script de carga de archivos). Lokad persiste ambos sabores de datos a través de Azure Blob Storage actuando como un almacén de clave-valor.

Almacén de eventos

El almacén de eventos persiste los eventos generados por todos los servicios de la plataforma Lokad. Este almacén representa la base de datos de transición de estado de Lokad. Hemos publicado el código fuente de nuestro almacén de eventos como código abierto.

Este componente es simple: solo persiste y sirve eventos, de manera confiable, aprovechando un almacén de clave-valor distribuido subyacente (Azure Blob Storage). Se espera que los eventos sean pequeños, limitados a 512kB, pero típicamente menos de 1kB.

No hay características “inteligentes”, como análisis de transmisión o gestión de proyecciones. Nuevamente, al hacer menos, Lokad elimina clases enteras de problemas, como ataques de inyección SQL, que surgen debido a las capacidades de la capa de persistencia.

Almacén de direcciones de contenido

El almacén de direcciones de contenido (CAS) persiste los archivos, ya sea subidos a la plataforma Lokad o generados a través de los scripts de Envision. Hemos publicado el origen de nuestro almacén de direcciones de contenido como código abierto.

El CAS está destinado a admitir archivos grandes, típicamente de varios MB, con un límite máximo de 100GB. El CAS se utiliza para almacenar archivos o fragmentos de archivos, fragmentados siguiendo una estrategia de almacenamiento columnar. El almacenamiento columnar está alineado con el patrón de acceso de la capa de ejecución.

La capa de ejecución

Como su nombre lo indica, la capa de ejecución garantiza la ejecución de los scripts de Envision dentro de la plataforma Lokad, e incluye una serie de componentes. Por brevedad, enumeraremos aquí solo los más notables. El compilador transforma los scripts de Envision en instrucciones destinadas a una máquina virtual distribuida. El programador es un servicio de utilidad para activar, programar y secuenciar los scripts de Envision. Thunks es el nombre en clave de la máquina virtual de Envision. Finalmente, Ionic es el nombre de la estrategia de almacenamiento columnar, producida y consumida por la máquina virtual de Envision.

Compilador

El compilador transforma los scripts de Envision en bytecode destinado a la máquina virtual distribuida de la plataforma de Lokad, llamada “Thunks” (ver más abajo). La arquitectura de este compilador sigue prácticas de diseño convencionales: un pipeline de compilación que comienza con el análisis seguido de una serie de transformaciones de una representación interna a la siguiente, terminando con la producción de bytecode.

El backend del servidor de lenguaje, que guía las interacciones con el código fuente de Envision (ver el servicio de Código, arriba), también forma parte del compilador. El servidor de lenguaje es estado para proporcionar comentarios significativos y mensajes de error al programador de Envision, a medida que se avanza en la codificación. Después de la mayoría de las pulsaciones de teclas, el script no es un script de Envision válido (todavía), pero gracias al estado del servidor de lenguaje, se proporcionan comentarios significativos de todos modos.

Programador

El programador es un servicio de utilidad para ejecutar scripts de Envision sin intervenciones manuales. El programador activa, programa y secuencia la ejecución de los scripts de Envision. También proporciona capacidades de alerta si las ejecuciones se desvían de sus plazos esperados. La integración estrecha del programador con el resto de la plataforma proporciona una serie de características deseables, como disparadores de cambio de archivo (para iniciar scripts de Envision al recibir archivos, por ejemplo), o la detección temprana de fallos pendientes (si uno de los scripts de Envision dentro de una secuencia no se compila).

Thunks

Thunks es el nombre en clave de la máquina virtual distribuida de Lokad. De hecho, los scripts de Envision se benefician nativamente de una ejecución distribuida. En este sentido, el compilador de Envision no apunta a una máquina única sino a un grupo de ellas. Esta característica es fundamental para procesar grandes conjuntos de datos de manera oportuna. El lenguaje de Envision fue diseñado especialmente para la paralelización automática (una característica que de otra manera sería muy difícil de lograr con un lenguaje de programación general). Por cierto, el grupo también proporciona una mayor fiabilidad en la ejecución de scripts si una máquina se vuelve no receptiva.

El grupo de máquinas dedicadas a Thunks se agrupa, de manera multiinquilina, en todas las cuentas. Esta característica es esencial para mantener los costos informáticos bajo control. El caso de uso típico de la cadena de suministro implica un lote de ejecución por día, que suele durar menos de 60 minutos. Agrupar los recursos a través de la multiinquilinidad mitiga en gran medida los costos asociados con los recursos informáticos, un costo que de otra manera se cobraría en períodos de 24 horas, mientras que solo se utilizaría una hora (posiblemente menos).

Para una explicación más detallada, sugerimos la serie de 4 partes de Victor Nicollet sobre el diseño de la Máquina Virtual Envision, y para respuestas a las preguntas más comunes relacionadas con el rendimiento de Lokad, recomendamos la sección 8 de nuestras FAQ de Seguridad.