Arquitectura de la plataforma Lokad

La plataforma de Lokad es una solución SaaS alojada en la nube y 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 profesional de la cadena de suministro con conocimientos técnicos 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

Descripción general 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. Si bien Envision implica programación, Lokad está destinado a especialistas en cadena 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 los requisitos divergentes en términos de confiabilidad, seguridad y rendimiento de cada servicio, en lugar de 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 de .NET en sí, tenemos muy pocas otras dependencias (aproximadamente una orden de magnitud menos que la norma).

Esta arquitectura difiere ampliamente de las arquitecturas “habituales” que se encuentran en 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 caché: en su lugar, colocalizamos la computación y el almacenamiento transitorio.
  • Gestor de canalización: 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.
  • Conjunto de herramientas de aprendizaje automático: en su lugar, el DSL también proporciona capacidades de ML.
  • Conjunto de herramientas de visualización de datos: en su lugar, hemos implementado el nuestro propio, con una integración estrecha del DSL.

Cabe destacar que, aunque internalizamos ampliamente el desarrollo de nuestra plataforma, confiamos intencional y exclusivamente 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 se realizan 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 en el lado del servidor y, especialmente, 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 indica, se encarga de renderizar los paneles de análisis web proporcionados por Lokad.

Cada panel de control es el resultado de un script de Envision ejecutado. Los paneles de control se calculan de forma exhaustiva, aunque también se ofrecen algunas capacidades interactivas. El diseño de Envision en sí garantiza que las interacciones del lado del cliente sigan siendo problemas de datos pequeños, independientemente del tamaño del conjunto de datos original.

En el 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.

En el lado del servidor, los datos asociados a un panel de control determinado se empaquetan mediante el almacén de contenido. Una vez más, 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 brindan al usuario final la posibilidad de acceder a grandes conjuntos de datos, más allá de lo que sería posible transferir y mostrar a través de un navegador. Cambiar de una vista a otra requiere como máximo una única solicitud del lado del cliente (y muy pocas del lado del servidor).

Lokad vs. herramientas convencionales

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 dichas herramientas están compuestos invariablemente por una lista de mosaicos, a veces llamados bloques o widgets. La forma estándar de manejar 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 una demora perceptible 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 aún menos en el lado del servidor. Desde nuestra perspectiva, el rendimiento de los paneles de control comienza en tiempo de compilación, con los scripts que respaldan 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 invariablemente a problemas de rendimiento cuando aumenta el número de usuarios finales concurrentes, ya que hay un conflicto inevitable por los recursos informáticos del lado del servidor que se mutualizan para atender a todos los usuarios finales.

Lokad mitiga ampliamente este problema mediante la precomputación de paneles de control. Nuestro diseño minimiza los recursos del lado del servidor necesarios, a petición del usuario final, para servir un panel de control, dejando que el almacén de contenido sea el principal (pero intencionado) cuello de botella para servir los datos del panel de control. Este diseño garantiza que se puedan atender simultáneamente a un gran número de usuarios finales con paneles de control 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 permisos de acceso adecuados, pueden ver, editar y ejecutar proyectos. Una aplicación de optimización predictiva personalizada implementada por Lokad generalmente incluye una lista de proyectos.

Se utiliza el event sourcing para persistir las entradas de los usuarios, 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 patrón CQRS+ES. CQRS significa Segregación de Responsabilidad de Comando y Consulta, mientras que ES significa Event Source.

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 mainstream

En cuanto a la interfaz de usuario y la experiencia de usuario, el servicio de proyectos sigue el enfoque convencional. Sin embargo, en el fondo se utiliza el patrón CQRS+ES como alternativa al patrón CRUD (crear, leer, actualizar, eliminar) utilizado en la mayoría del software empresarial. Este patrón reemplaza la base de datos relacional por 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 ampliamente 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 consiste en código fuente de Envision.

Código

El servicio de código cuenta con un entorno de desarrollo integrado (IDE, por sus siglas en inglés) 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 resaltado de código, la autocompletación y una serie de acciones de código (por ejemplo, el 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 principales desafíos técnicos consiste en mantener una baja latencia para esta función, ya que los retrasos serían bastante perceptibles al considerar el ritmo de las interacciones normales del teclado.

Archivos

Cada cuenta en Lokad tiene su propio espacio para almacenar archivos. El servicio de archivos cuenta con un sistema de archivos distribuido y 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 a archivos planos de varios gigabytes.

La versión de archivos se garantiza mediante el 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 garantiza mediante un almacén de contenido direccionable (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 de las aplicaciones de la 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 mainstream

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, una pieza 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 simultáneamente por varios procesos. Estas 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 comunes de Lokad. Gestiona 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 se vea comprometido por no haber seleccionado eventos registrados en él.

La capa de persistencia

La capa de persistencia, como su nombre indica, garantiza la persistencia de todos los datos gestionados por Lokad. Estos datos se presentan en dos sabores distintos: primero, los archivos, ya sea cargados por los clientes en Lokad o generados a través de scripts de Envision; segundo, los eventos resultantes de las operaciones de los usuarios (incluidos los agentes automatizados, como un script de carga de archivos). Lokad persiste ambos sabores de datos a través de Azure Blob Storage, que actúa como una base de datos clave-valor.

Almacenamiento de eventos

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

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

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.

Almacenamiento direccionable por contenido

El almacenamiento direccionable por contenido (CAS) persiste los archivos, ya sea cargados en la plataforma Lokad o generados a través de los scripts de Envision. Hemos publicado el código fuente de nuestro almacenamiento direccionable por 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 100 GB. El CAS se utiliza para almacenar archivos o fragmentos de archivos, fragmentados siguiendo una estrategia de almacenamiento columnar. El almacenamiento columnar se alinea con el patrón de acceso de la capa de ejecución.

La capa de ejecución

Como su nombre 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 razones de brevedad, aquí enumeraremos solo los más destacados. 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 las prácticas de diseño convencionales: una tubería de compilación que comienza con el análisis sintáctico seguido de una serie de transformaciones de una representación interna a la siguiente, y termina 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 tiene estado para proporcionar comentarios significativos y mensajes de error al programador de Envision mientras se está codificando. Después de la mayoría de las pulsaciones de teclas, el script no es un script de Envision válido (aún), 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 intervención manual. 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 estrecha integración 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 en 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 clúster de ellas.. Esta característica es fundamental para procesar conjuntos de datos grandes de manera oportuna. El lenguaje de Envision fue especialmente diseñado para la paralelización automática (una característica que de otra manera es muy difícil de lograr con un lenguaje de programación general). Por cierto, el clúster también proporciona una mayor confiabilidad en la ejecución de scripts si una máquina deja de responder.

El clúster 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 generalmente dura 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 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 Preguntas frecuentes de seguridad.