Архитектура платформы Lokad

Платформа Lokad — это облачное SaaS-решение с поддержкой множественной аренды. Эта страница представляет высокоуровневую архитектуру платформы. Хотя страница предназначена для ИТ-аудитории, опытный специалист по цепям поставок может найти эту информацию интересной, поскольку данная архитектура отражает наше технологическое видение предиктивной оптимизации цепей поставок.

system-architecture

Обзор архитектуры

Lokad представляет собой среду для разработки и эксплуатации приложений предиктивной оптимизации, предназначенных для задач в сфере цепей поставок. В основе лежит предметно-ориентированный язык (DSL) под названием Envision, разработанный Lokad. Envision доступен конечным пользователям, и большинство возможностей предоставляется через него. Хотя Envision подразумевает программирование, Lokad предназначен для специалистов по цепям поставок, а не для ИТ-специалистов или разработчиков программного обеспечения.

Платформа Lokad поддерживает множественную аренду: одно и то же приложение обслуживает всех наших клиентов и включает короткий перечень сервисов. Детализация разделения в первую очередь обусловлена различными требованиями к надёжности, безопасности и производительности каждого сервиса – а не чистым функциональным разделением. Действительно, степень взаимосвязи между этими сервисами относительно высока. Эти сервисы используют один и тот же репозиторий Git, и они часто обновляются одновременно.

Наш код написан на языках F#, C# и TypeScript с минимальным количеством сторонних зависимостей, за исключением .NET — открытого фреймворка, разработанного Microsoft. Более того, помимо .NET, у нас очень мало других зависимостей (примерно на порядок меньше, чем обычно).

Эта архитектура значительно отличается от «обычных» архитектур, встречающихся в корпоративных приложениях – и по уважительным причинам. Обычное корпоративное приложение зависит от тяжёлых и обширных зависимостей; каждая зависимость, как правило, исчисляется более чем миллионом строк кода. Однако Lokad не использует сторонние зависимости в следующих областях:

  • Реляционная база данных: вместо этого мы используем хранилище событий вместе с хранилищем с адресацией содержимого.
  • Система кэширования: вместо этого мы локализуем вычисления и временное хранилище.
  • Менеджер конвейеров: вместо этого у нас есть собственный планировщик (подробнее см. ниже)
  • Аналитический движок: вместо этого наш DSL под названием Envision предоставляет аналитические возможности.
  • Набор инструментов машинного обучения: вместо этого DSL также обеспечивает возможности ML.
  • Набор инструментов для визуализации данных: вместо этого мы разработали собственный инструмент, тесно интегрированный с DSL.

Следует отметить, что, хотя мы активно разрабатываем платформу внутри компании, мы сознательно и исключительно полагаемся на сторонние компоненты для всех наших механизмов безопасности, таких как криптографические алгоритмы.

Фронтенд

Фронтенд включает в себя элементы, доступные конечным пользователям, а также автоматизированных агентов, используемых для передачи данных в Lokad и из него. Большинство этих взаимодействий происходит через веб-браузер по протоколу HTTPS, хотя Lokad также поддерживает протоколы FTPS и SFTP для передачи файлов.

go.lokad.com

Этот сервис размещает React — фронтенд-фреймворк веб-приложения Lokad, реализованного как одностраничное приложение (SPA). Фронтенд зависит от API (интерфейсов программирования приложений), предоставляемых другими сервисами.

Сервис исключительно обслуживает статический контент – в основном JavaScript. Здесь отсутствуют серверные компоненты, и, что важно, нет постоянства данных. Такой дизайн намерен, поскольку время безотказной работы является главным приоритетом для этого сервиса; вне зависимости от того, какой сервис используется через веб, сервис go.lokad.com должен быть доступен.

Панели управления

Сервис dashboards, как и следует из названия, отвечает за отображение веб-аналитических панелей, предоставляемых Lokad.

Каждая панель является результатом выполнения скрипта Envision. Панели управления широко предварительно вычисляются, хотя также предлагаются некоторые интерактивные возможности. Дизайн Envision гарантирует, что клиентские взаимодействия остаются задачами с небольшим объёмом данных, независимо от размера исходного набора данных.

На клиентской стороне все данные, необходимые для первого отображения панели, получаются через единый HTTPS-запрос. Такой подход минимизирует задержки. Бинарная упаковка и сжатие снижают потребление полосы пропускания.

На серверной стороне данные, связанные с конкретной панелью, упаковываются с помощью хранилища содержимого. Упаковка необходима для поддержания минимального общего числа сетевых запросов – обычно менее полудюжины, независимо от сложности панели.

Интерактивные панели позволяют конечному пользователю получать доступ к большим наборам данных, превышающим возможности передачи и отображения в браузере. Переход от одного представления к другому требует не более одного клиентского запроса (и очень немногих серверных).

Lokad против мейнстрима

Дизайн с постоянным временем рендеринга в Lokad отличается от подходов, принятых в массовых решениях бизнес-аналитики (BI) и других аналитических инструментах. Панели в таких инструментах обычно состоят из набора плиток, иногда называемых блоками или виджетами. Стандартный подход подразумевает 1 клиентский запрос на плитку, за которым следует неопределённое/негарантированное число серверных запросов. К сожалению, такой дизайн приводит к «тормозящим» панелям с заметной задержкой для каждой плитки. Кроме того, полное отображение всех плиток панели часто занимает несколько секунд.

Lokad устраняет эту проблему, поскольку компилятор Envision разрабатывает стратегию упаковки данных, используемых для отображения панели, что обеспечивает как однозначные запросы на клиентской стороне, так и ещё меньшее число запросов на серверной. По нашему мнению, производительность панелей начинается уже на этапе компиляции, когда скрипты поддерживают панели.

Более того, большинство аналитических инструментов откладывают значительную часть вычислений до запроса панели (иногда называемой отчётом). К сожалению, такой подход неизбежно приводит к проблемам с производительностью при увеличении числа одновременно подключённых конечных пользователей, поскольку возникает неизбежное соревнование за серверные вычислительные ресурсы, используемые всеми пользователями.

Lokad существенно смягчает эту проблему посредством предварительных вычислений панелей. Наш дизайн минимизирует потребность в серверных ресурсах, необходимых по запросу конечного пользователя для обслуживания панели, оставляя хранилище содержимого основным (и преднамеренным) узким местом при передаче данных панели. Такой подход гарантирует, что большое число конечных пользователей может одновременно получать панели с минимальным ухудшением производительности.

Проекты

Сервис проектов управляет скриптами и пакетными заданиями (называемыми последовательностями). Он обладает иерархической структурой проектов. Конечные пользователи, обладающие соответствующими правами доступа, могут просматривать, редактировать и запускать проекты. Специальное приложение для предиктивной оптимизации, разработанное Lokad, обычно включает список проектов.

Для сохранения пользовательских записей используется event sourcing с применением описанного ниже хранилища событий. Каждая команда или взаимодействие, отправленные в сервис, регистрируются и преобразуются в соответствующее событие. Пользовательский интерфейс отображает состояние, полученное путем объединения всех событий. Этот подход известен как паттерн CQRS+ES. CQRS означает разделение ответственности за команды и запросы, а ES — источник событий.

Паттерн CQRS+ES обеспечивает по замыслу полную историю всех изменений, внесённых в приложение. В конкретном случае Lokad это обеспечивает версионирование, подобное Git, для всех изменений, когда-либо применённых к скриптам Envision, находящимся в аккаунте.

Lokad против мейнстрима

С точки зрения UI и UX, сервис проектов следует общепринятому подходу. Однако под капотом для большинства корпоративного программного обеспечения вместо метода CRUD (создать, прочитать, обновить, удалить) используется паттерн CQRS+ES. Этот паттерн заменяет реляционную базу данных на хранилище событий (рассматривается ниже).

Подход CQRS+ES предлагает множество преимуществ по сравнению с паттерном CRUD. Например, он обеспечивает лучшую семантику, улучшенную возможность аудита и, в случае Lokad, повышенную производительность, поскольку позволяет нам значительно кастомизировать стратегию постоянства, используемую для хранения и извлечения исходного кода Envision. Фактически, основная часть данных, сохраняемых сервисом проектов, состоит из исходного кода Envision.

Код

Сервис кода предоставляет интегрированную среду разработки (IDE), предназначенную для языка Envision. Этот веб-IDE включает все функции современного средства разработки, такие как подсветка синтаксиса, автодополнение и ряд операций с кодом (например, переименование переменных), осуществляемых с помощью статического анализа.

Основная сложность сервиса кода заключается в его серверной части — языковом сервере, который обеспечивает обратную связь в режиме реального времени: подсказки для автодополнения, ошибки или операции с кодом при каждом нажатии клавиши. В частности, одной из основных задач является поддержание низкой задержки этой функции, так как даже незначительные задержки заметны при обычном темпе набора текста.

Файлы

Каждый аккаунт в Lokad имеет собственное пространство для хранения файлов. Сервис файлов предоставляет распределённую версионированную файловую систему, используемую для управления файлами. К этой файловой системе можно получить доступ через веб-интерфейс, а также по протоколам SFTP и FTPS. По сути, эта файловая система во многом схожа с репозиторием Git, за исключением того, что она предназначена для работы с файлами размером в гигабайты.

Версионирование файлов осуществляется с помощью паттерна CQRS+ES, который дополняет представление последовательности «коммитов», отражающих эволюцию самой файловой системы. Сохранение содержимого файлов обеспечивается через хранилище с адресацией содержимого (рассматривается ниже).

Версионируя как код (скрипты Envision), так и данные, Lokad обеспечивает полную воспроизводимость прошлых состояний для приложений цепей поставок, развёрнутых на его платформе. С точки зрения цепей поставок эта возможность важна для того, чтобы каждую аномалию, созданную приложением, можно было тщательно проанализировать.

Lokad против мейнстрима

Сервис файлов тесно интегрирован с языком Envision (обеспечивая преимущества корректности), с IDE Envision (повышая продуктивность) и с средой выполнения Envision (обеспечивая производительность). Достичь таких преимуществ было бы сложно с файловой системой общего назначения, которая прежде всего является дополнением ядра.

Кроме того, многие преимущества сервиса файлов достигаются за счёт упрощения по сравнению с файловой системой общего назначения. Например, сервис файлов не позволяет нескольким процессам одновременно обновлять один и тот же файл. Такие ограничения в контексте приложений для цепей поставок лишь подвергают специалистов по цепям поставок ИТ-проблемам и сложностям, не приводящим к ощутимой ценности.

Аккаунты

Управление идентификацией и доступом (IAM) в сервисе аккаунтов является одной из самых распространённых частей Lokad. Он управляет аккаунтами Lokad, пользователями Lokad, а также аутентификацией (в идеале, делегированной аутентификацией) и списком контроля доступа (ACL), который определяет, что пользователи могут или не могут делать с аккаунтом Lokad.

Этот сервис также использует паттерн CQRS+ES, который обеспечивает полный журнал аудита всех операций IAM — операций, особенно чувствительных к вопросам безопасности из-за их природы. Использование источника событий в качестве журнала аудита также исключает целые классы проблем безопасности, таких как компрометация журнала из-за отсутствующих записей.

Слой постоянства

Слой постоянства, как можно судить по названию, отвечает за сохранение всех данных, которыми управляет Lokad. Эти данные бывают двух видов: во-первых, файлы — либо загруженные клиентами в Lokad, либо сгенерированные скриптами Envision; во-вторых, события, возникающие в результате операций пользователей (включая автоматизированных агентов, таких как скрипт загрузки файлов). Lokad сохраняет оба типа данных с помощью Azure Blob Storage, функционирующего как хранилище ключ-значение.

Хранилище событий

Хранилище событий сохраняет события, генерируемые всеми сервисами платформы Lokad. Это хранилище представляет собой базу данных переходов состояний Lokad. Мы выпустили исходный код нашего хранилища событий в открытый доступ.

Этот компонент прост: он лишь сохраняет и обслуживает события надёжным образом, используя распределённое хранилище ключ-значение (Azure Blob Storage). Ожидается, что события будут небольшими — ограниченными 512 кБ, но обычно менее 1 кБ.

Здесь отсутствуют «умные» функции, такие как аналитика потоков или управление проекциями. Снова, за счёт упрощения Lokad устраняет целые классы проблем, например, связанные с SQL-инъекциями, возникающими из-за особенностей слоя постоянства.

Хранилище с адресацией содержимого

Хранилище с адресацией содержимого (CAS) сохраняет файлы, загруженные на платформу Lokad или сгенерированные скриптами Envision. Мы выпустили исходный код нашего хранилища с адресацией содержимого в открытый доступ.

CAS предназначено для поддержки больших файлов, обычно нескольких МБ, с верхним пределом в 100 ГБ. CAS используется для хранения файлов или их фрагментов, распределённых с использованием колоночной стратегии хранения. Колоночное хранение соответствует схеме доступа исполнительного слоя.

Исполнительный слой

Как следует из названия, исполнительный слой обеспечивает выполнение скриптов Envision в рамках платформы Lokad и включает ряд компонентов. Для краткости мы перечислим здесь только наиболее заметные. Компилятор преобразует скрипты Envision в инструкции, предназначенные для распределённой виртуальной машины. Планировщик — это утилита для запуска, планирования и последовательного выполнения скриптов Envision. Thunks — кодовое название виртуальной машины Envision. Наконец, Ionic — название стратегии колоночного хранения, создаваемой и используемой виртуальной машиной Envision.

Компилятор

Компилятор преобразует скрипты Envision в байт-код, предназначенный для распределённой виртуальной машины платформы Lokad — названной «Thunks» (см. ниже). Архитектура этого компилятора следует общепринятым практикам дизайна: конвейер компиляции, который начинается с парсинга, за которым следует ряд преобразований от одного внутреннего представления к другому, завершаясь генерацией байт-кода. Серверный язык (backend), который направляет взаимодействие с исходным кодом Envision (см. сервис Code, выше), также является частью компилятора. Языковой сервер обладает состоянием, чтобы предоставлять содержательную обратную связь и сообщения об ошибках программисту Envision в процессе написания кода. После большинства нажатий клавиш скрипт ещё не является допустимым Envision скриптом, но благодаря состоянию языкового сервера всё же предоставляется значимая обратная связь.

Планировщик

Планировщик — это утилитарный сервис для выполнения Envision скриптов без ручного вмешательства. Планировщик инициирует, планирует и упорядочивает выполнение Envision скриптов. Он также обеспечивает возможности оповещений, если выполнение отклоняется от ожидаемых сроков. Тесная интеграция планировщика с остальной частью платформы предоставляет ряд полезных функций, таких как триггеры изменения файлов (например, для запуска Envision скриптов при получении файлов) или раннее обнаружение возможного сбоя (если один из Envision скриптов в последовательности не компилируется).

Thunks

Thunks — это кодовое название распределённой виртуальной машины Lokad. Фактически, Envision скрипты нативно используют распределённое выполнение. В этом смысле компилятор Envision нацелен не на одну машину, а на их кластер. Эта функция имеет решающее значение для своевременной обработки больших наборов данных. Язык Envision был специально разработан для автоматической параллелизации (функция, которая в противном случае была бы очень сложной для реализации с помощью общего языка программирования). Кстати, кластер также обеспечивает более высокую надёжность выполнения скриптов, если одна из машин становится недоступной.

Кластер машин, предназначенных для Thunks, используется совместно в многоарендном режиме для всех аккаунтов. Эта функция необходима для контроля вычислительных затрат. Типичный сценарий использования в цепочке поставок предполагает одну партию выполнения в день, обычно продолжающуюся менее 60 минут. Совместное использование ресурсов через многоарендность значительно снижает накладные расходы, связанные с вычислительными ресурсами — затраты, которые в противном случае начислялись бы за 24-часовые периоды, хотя использовался бы всего один час (возможно, и меньше).

Для подробного объяснения мы рекомендуем четырёхсерийный цикл Виктора Николле о дизайне Envision Virtual Machine, а для ответов на наиболее распространённые вопросы Lokad, связанные с производительностью, — раздел 8 нашего FAQ по безопасности.