Arquitectura de la plataforma de Lokad
La plataforma de Lokad es una solución SaaS alojada en la nube y multi-tenant. 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 del supply chain 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 supply chain.

Resumen de la arquitectura
Lokad se presenta como un entorno para desarrollar y operar aplicaciones de optimización predictiva destinadas a problemas de supply chain. En su núcleo se encuentra un lenguaje específico del dominio (DSL) llamado Envision, diseñado por Lokad. Envision es accesible para los usuarios finales y la mayoría de las funcionalidades se entregan a través de él. Aunque Envision implica programación, Lokad está dirigido a especialistas en supply chain, no a especialistas en TI o ingenieros de software.
La plataforma de Lokad es multi-tenant: la misma aplicación sirve a todos nuestros clientes e incluye una breve serie de servicios. La granularidad de la separación se debe principalmente a requerimientos divergentes en términos de confiabilidad, seguridad y rendimiento de cada servicio, en lugar de una separación puramente funcional. De hecho, el nivel de acoplamiento entre estos servicios es relativamente alto. Estos servicios comparten el mismo repositorio de código Git, y con frecuencia se actualizan juntos.
Nuestra base de código está implementada en F#, C# y TypeScript con pocas dependencias de terceros más allá de .NET, un framework de código abierto desarrollado por Microsoft. Además, aparte de .NET, tenemos muy pocas otras dependencias (aproximadamente un orden de magnitud menos que la norma).
Esta arquitectura difiere ampliamente de las arquitecturas “usuales” que se encuentran en las aplicaciones empresariales, y con buenas razones. La aplicación empresarial común depende de dependencias pesadas y extensas; cada dependencia típicamente contiene 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 event store junto con un almacén direccionable por contenido.
- Sistema de caché: en su lugar, colocalizamos el cómputo y el almacenamiento transitorio.
- Gestor de pipeline: en su lugar, tenemos nuestro propio scheduler (detallado a continuación)
- Motor de analítica: en su lugar, nuestro DSL llamado Envision proporciona capacidades analíticas.
- Conjunto de herramientas de machine learning: en su lugar, el DSL también proporciona capacidades de ML.
- Conjunto de herramientas de visualización de datos: en su lugar, hemos desarrollado uno propio, con una integración estrecha con el DSL.
Cabe señalar que, mientras internalizamos extensivamente el desarrollo de nuestra plataforma, intencional y exclusivamente dependemos de componentes de terceros para todos nuestros componentes de seguridad, como los algoritmos criptográficos.
El front-end
El front-end se refiere a los elementos a los que tienen acceso los usuarios finales, incluidos los agentes automatizados que se usan 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 soporta los protocolos FTPS y SFTP para mover archivos.
go.lokad.com
Este servicio aloja React, el framework de front-end de la aplicación web de Lokad, implementado como una aplicación de una sola página (SPA). Este front-end depende de las APIs (interfaces de programación de aplicaciones) proporcionadas por los otros servicios.
Este servicio sirve exclusivamente contenido estático, principalmente JavaScript. No hay componentes dinámicos del lado del servidor y, notablemente, no hay persistencia de datos. Este diseño es intencional ya que el uptime es la máxima prioridad para este servicio; sin importar 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 control analíticos web proporcionados por Lokad.
Cada panel de control es el resultado de un script Envision ejecutado. Los paneles de control se pre-calculan extensamente, aunque también se ofrecen algunas capacidades interactivas. El diseño del propio Envision asegura que las interacciones del lado del cliente se mantengan como problemas de datos pequeños, sin importar el tamaño del conjunto de datos original.
En el lado del cliente, todos los datos necesarios para la primera renderización del panel se obtienen a través de una única solicitud HTTPS. Este diseño de solicitud única sirve para minimizar la 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 determinado son empaquetados por el content store. 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.
Los paneles de control interactivos ofrecen al usuario final la posibilidad de acceder a conjuntos de datos grandes, más allá de lo que sería posible transferir y mostrar en 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 convencional
El diseño de tiempo de renderización constante de Lokad difiere de la inteligencia de negocios (BI) convencional y de otras herramientas analíticas. Los paneles que se encuentran en dichas herramientas están invariablemente compuestos por una lista de módulos, a veces llamados bloques o widgets. La forma estándar de tratar estos módulos implica una solicitud del lado del cliente por cada módulo, seguida de un número no especificado/no garantizado de solicitudes del lado del servidor. Desafortunadamente, este diseño conduce a paneles lentos con un retraso perceptible en cada módulo. Además, la visualización completa de todos los módulos del panel de control frecuentemente toma varios segundos.
Lokad elimina este problema haciendo que el compilador de Envision produzca una estrategia de empaquetado de los datos utilizados para renderizar el panel, asegurando así solicitudes de un solo dígito en el lado del cliente, e incluso menos en el lado del servidor. Desde nuestra perspectiva, el rendimiento de los paneles comienza en tiempo de compilación, con 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 (a veces llamado reporte). Desafortunadamente, el diseño también conduce invariablemente a problemas de rendimiento cuando aumenta el número de usuarios simultáneos, ya que existe un conflicto inevitable por los recursos de cómputo del lado del servidor, los cuales se comparten para atender a todos los usuarios finales.
Lokad mitiga extensamente este problema mediante el pre-cálculo de los paneles. Nuestro diseño minimiza los recursos del lado del servidor necesarios – a demanda del usuario final – para servir un panel de control, dejando al content store como el principal cuello de botella (intencionadamente) para servir los datos de los paneles de control. Este diseño asegura que un gran número de usuarios finales pueda ser atendido con paneles de control de manera concurrente sin una degradación significativa 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 diseñada a medida e implementada por Lokad típicamente incluye una lista de proyectos.
Se utiliza event sourcing para persistir las entradas de los usuarios, aprovechando el event store detallado aquí. Cada comando o interacción enviada al servicio se registra y se convierte en un evento resultante. La interfaz de usuario presenta el estado obtenido al compilar 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, ofrece un control de versiones similar a Git de todos los cambios aplicados a los scripts de Envision presentes en la cuenta.
Lokad vs convencional
En términos de UI y UX, el servicio de proyectos sigue el enfoque convencional. Sin embargo, internamente se utiliza el patrón CQRS+ES como una alternativa al CRUD (crear, leer, actualizar, eliminar) utilizado en la mayoría de los software empresariales. Este patrón reemplaza la base de datos relacional por un event store (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 persiste el servicio de proyectos consiste en código fuente de Envision.
Código
El servicio de código incluye un IDE (entorno de desarrollo integrado) dedicado al lenguaje Envision. Este IDE basado en la web posee todas las características y funcionalidades esperadas de un entorno de desarrollo moderno, tales como resaltado de código, autocompletado y una serie de acciones de código (por ejemplo: renombrado de variables), posibilitadas mediante análisis estático de código.
La mayor parte de la complejidad del servicio de código reside en su backend de language server que proporciona retroalimentación en tiempo real: sugerencias para autocompletado, errores o acciones de código en cada pulsación de tecla. En particular, uno de los retos 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 versionado y distribuido que se utiliza para gestionar sus archivos. Este sistema de archivos puede ser accedido a través de una interfaz web y mediante los protocolos SFTP y FTPS. Conceptualmente, este sistema es en gran medida similar a un repositorio Git, excepto que está diseñado para archivos planos de tamaño gigabyte.
La versionació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 asegura a través de un content addressable store (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 supply chain desplegadas en su plataforma. Desde una perspectiva de supply chain, esta capacidad es importante para asegurarse de que cada resultado anómalo generado por la aplicación de supply chain pueda ser investigado.
Lokad vs convencional
El servicio de archivos está estrechamente integrado con el lenguaje Envision (ofreciendo beneficios de corrección), el IDE de Envision (ofreciendo beneficios de productividad) y el runtime de Envision (ofreciendo 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 complemento del kernel.
Además, muchos de los beneficios del servicio de archivos se obtienen haciendo 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 supply chain, solo exponen a los profesionales de supply chain a problemas y complejidades centrados en TI sin aportar un 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. 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 completos de auditoría de todas las operaciones de IAM, operaciones que siempre son sensibles en términos de seguridad dada la naturaleza misma de la IAM. Usar el event source 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 tener ciertos eventos seleccionados registrados en él.
La capa de persistencia
La capa de persistencia, como su nombre indica, asegura la persistencia de todos los datos gestionados por Lokad. Estos datos se presentan en dos formas distintas: primero, los archivos, ya sean 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 (incluyendo agentes automatizados, como un script de subida de archivos). Lokad persiste ambos tipos 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 de Lokad. Este almacén representa la base de datos de transiciones de estado de Lokad. Hemos liberado el código fuente de nuestro event store como open source.
Este componente es simple: solo persiste y sirve eventos de manera confiable, aprovechando un almacén distribuido de clave-valor subyacente (Azure Blob Storage). Se espera que los eventos sean pequeños, limitados a 512kB, pero normalmente de menos de 1kB.
No existen características “inteligentes”, como analíticas en streaming o la gestión de proyecciones. Nuevamente, al hacer menos, Lokad elimina clases enteras de problemas, como los ataques de inyección SQL, que surgen debido a las capacidades de la capa de persistencia.
Almacén direccionable por contenido
El almacén direccionable por contenido (CAS) persiste los archivos, ya sean subidos a la plataforma de Lokad o generados a través de los scripts de Envision. Hemos liberado el código fuente de nuestro content addressable storage como open source.
El CAS está diseñado para soportar archivos grandes, típicamente de varios MB, con un límite superior de 100GB. El CAS se utiliza para almacenar archivos, o fragmentos de archivos, repartidos según 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 indica, la capa de ejecución se encarga de la ejecución de scripts de Envision dentro de la plataforma de Lokad, e incluye una serie de componentes. Para resumir, enlistaremos aquí solo los más notables. El compiler transforma los scripts de Envision en instrucciones destinadas a una máquina virtual distribuida. El scheduler es un servicio auxiliar para disparar, programar y secuenciar 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” (véase a continuación). La arquitectura de este compilador sigue las prácticas de diseño convencionales: una cadena 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, terminando con la producción de bytecode.
El back-end del servidor de lenguaje, que guía las interacciones con el código fuente de Envision (ver el servicio Code, arriba), también forma parte del compilador. El servidor de lenguaje mantiene estado para proporcionar comentarios significativos y mensajes de error al programador de Envision, mientras se escribe el código. Después de la mayoría de las pulsaciones, el script aún no es un script válido de Envision (por ahora), pero gracias al estado del servidor de lenguaje, se proporciona retroalimentación significativa.
Planificador
El planificador es un servicio auxiliar para ejecutar scripts de Envision sin intervenciones manuales. El planificador activa, programa y secuencia la ejecución de scripts de Envision. También proporciona capacidades de alerta si las ejecuciones se desvían de sus plazos esperados. La estrecha integración del planificador con el resto de la plataforma ofrece una serie de características deseables, tales como activadores por cambio de archivo (para iniciar scripts de Envision al recibir archivos, por ejemplo), o la detección temprana de fallos inminentes (si uno de los scripts de Envision dentro de una secuencia no compila).
Thunks
Thunks es el nombre clave de la máquina virtual distribuida de Lokad. De hecho, los scripts de Envision se benefician de forma nativa de una ejecución distribuida. En este sentido, el compilador de Envision no se dirige a una sola máquina sino a un clúster de ellas.. Esta característica es fundamental para procesar grandes conjuntos de datos de manera oportuna. El lenguaje Envision fue diseñado especialmente para la paralelización automática (una característica que, de otro modo, es muy difícil de lograr con un lenguaje de programación general). Por cierto, el clúster también proporciona una mayor fiabilidad en la ejecución de scripts si una máquina se vuelve inoperativa.
El clúster de máquinas dedicado a Thunks se comparte, de forma multi-tenant, entre todas las cuentas. Esta característica es esencial para mantener los costos de computación bajo control. El caso de uso típico de supply chain implica un lote de ejecución por día, que normalmente dura menos de 60 minutos. Compartir los recursos a través de la multi-tenencia mitiga en gran medida el costo adicional asociado con los recursos computacionales - 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 extensa, sugerimos la serie de 4 partes de Victor Nicollet sobre el diseño del Envision Virtual Machine, y para respuestas a las preguntas más comunes relacionadas con el rendimiento de Lokad, recomendamos la sección 8 de nuestro Security FAQ.