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

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

system-architecture

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

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

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

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

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

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

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

Фронтенд

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

go.lokad.com

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

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

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

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

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

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

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

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

Lokad против основных

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

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

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

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

Проекты

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

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

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

Lokad против основных

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

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

Код

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

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

Файлы

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

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

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

Lokad против основных

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

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

Аккаунты

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

Этот сервис также использует шаблон CQRS+ES, который предлагает полные журналы аудита всех операций IAM - операций, которые всегда являются критическими с точки зрения безопасности из-за самой природы 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” (см. ниже). Архитектура этого компилятора следует основным принципам проектирования: компиляционный конвейер, начинающийся с разбора, за которым следует серия преобразований из одного внутреннего представления в другое, заканчивающаяся созданием байт-кода.

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

Планировщик

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

Thunks

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

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

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