Механизм детерминированного рабочего процесса, построенный на основе компонентной модели WASM.
Статус проекта / Отказ от ответственности
Это предварительный выпуск .
Этот репозиторий содержит внутренний код для локальной разработки и тестирования. Программное обеспечение не имеет гарантий обратной совместимости для CLI, gRPC или схемы базы данных.
Поддерживаемые платформы
Линукс х64
Основные принципы
Сначала схема, используя язык WIT модели компонентов WASM в качестве интерфейса между рабочими процессами и действиями.
Радость бэкенд-разработчика
Единый процесс запуска исполнителя, рабочих процессов и действий с аварийным люком для внешних действий (планируется).
Автоматические повторные попытки при ошибках, тайм-аутах, выполнении рабочих процессов, продолжающихся после сбоя сервера.
Наблюдаемость (плановая) – параметры и результаты вместе с иерархией функций должны быть сохранены.
Компонуемость — вложение рабочих процессов, вызов действий, написанных на любом поддерживаемом языке.
Воспроизведение и разветвление существующих рабочих процессов (планируется). Устраните проблемы и продолжайте.
Концепции и особенности
Действия , которые должны быть идемпотентными (повторяемыми), чтобы их можно было остановить и повторить в любой момент. Этот контракт должен выполняться самой деятельностью.
Действия WASI выполняются в песочнице WASM.
Возможность связываться с HTTP-серверами с помощью HTTP-клиента WASI 0.2.
Возможность чтения/записи в файловой системе (планируется).
Поддержка максимальной продолжительности выполнения, после которой выполнение приостанавливается на прерывистый тайм-аут.
Повторные попытки при ошибках - при ловушках WASM (панике) или при возврате результата Error.
Повторные попытки по тайм-аутам с экспоненциальной задержкой.
Результат выполнения сохраняется.
Параметр производительности, позволяющий поддерживать выполнение родительского рабочего процесса в активном режиме или выгружать и воспроизводить историю событий.
Детерминированные рабочие процессы
Возможность воспроизведения: выполнение сохраняется при каждом изменении состояния, поэтому его можно воспроизвести после прерывания или ошибки.
Работа в песочнице WASM, изолированной от окружающей среды.
Автоматически повторяется при сбоях, таких как ошибки базы данных, тайм-ауты или даже ловушки (паника).
Возможность создавать дочерние рабочие процессы или действия, либо блокируя их до получения результата, либо асинхронно ожидая результата.
Рабочие процессы можно воспроизвести с добавлением сообщений журнала и другими изменениями, которые не изменяют детерминированность выполнения (запланировано).
Наборы соединений допускают структурированный параллелизм, либо блокируя до тех пор, пока не будут выполнены дочерние выполнения, либо отменяя те, которые не были ожидаемы (запланированы).
Веб-перехватчики WASI
Монтируется как URL-адрес и обслуживает HTTP-трафик.
Возможность создания дочерних рабочих процессов или действий.
Исполнитель, ворующий работу
Периодически блокируя пакет ожидающих выполнения, запускает/продолжает их выполнение.
Уборка старых висящих экзекуций с просроченными замками. Исполнения, имеющие бюджет, будут повторены (запланированы).
Управление параллелизмом — ограничение количества воркеров, которые могут работать одновременно.
docker exec$CONTAINER_ID obelisk client component list
# See Usage for more details
Готовый двоичный файл
Загрузите последнюю версию со страницы релизов GitHub.
Используем последнюю версию с сайта crates.io.
Загрузите с помощью Cargo-binstall
cargo binstall --locked obelisk
или построить с использованием груза
cargo install --locked obelisk
Никс хлопья
nix --extra-experimental-features nix-command --extra-experimental-features flakes run github:obeli-sk/obelisk
Использование
Создание примера файла конфигурации
obelisk server generate-config
Запуск сервера
obelisk server run
Получение списка загруженных функций
obelisk client component list
Отправка функции для выполнения (рабочего процесса или действия)
# Call fibonacci(10) activity from the workflow 500 times in series.
obelisk client execution submit testing:fibo-workflow/workflow.fiboa ' [10, 500] ' --follow
Вехи
Этап 1: Выпуск двоичного файла — готово
Запуск и запуск приложения obelisk в виде двоичного файла Linux.
Планирование рабочих процессов и действий Wasm, повторных попыток при тайм-аутах и сбоях.
Постоянство с использованием sqlite
Одновременный запуск дочерних рабочих процессов/действий с использованием наборов соединений
Базовый интерфейс командной строки для настройки и планирования компонентов Wasm.
Выпуск на Github, образ Docker, публикация на crates.io, поддержка cargo-binstall
Этап 2: разрешить удаленное взаимодействие через интерфейс командной строки — выполнено
Переместите компонент и общую конфигурацию в файл TOML.
Извлечение компонентов из реестра OCI.
Опубликуйте изображение обелиска в Docker Hub (ubuntu, alpine).
нажатие клиентского компонента обелиска
gRPC API для управления выполнением
Отслеживать самого верхнего родителя
Проверка типов параметров при создании, самоанализ типов всех функций в системе
Логирование и отслеживание конфигурации, отправка событий в сборщик OTLP
Этап 3: веб-перехватчики, проверка, структурированный параллелизм, веб-интерфейс — запущено
Триггеры веб-перехватчика HTTP могут запускать новые выполнения (рабочие процессы и действия), могут ждать результата перед отправкой ответа.
Пересылка stdout и stderr (настраиваемый) действий и веб-перехватчиков.
Поддержка распределенной трассировки, журналирования компонентов, собранных OTLP.
Сопоставление любого результата выполнения (например, ловушек, тайм-аутов, вариантов ошибок) с другими результатами выполнения с помощью -await-next
Проверка сервера — загружает компоненты, проверяет конфигурацию TOML и сопоставляет импорт компонентов с экспортом.
Структурированный параллелизм для наборов соединений — блокировка родительского элемента до завершения выполнения всех дочерних элементов.
Пользовательский интерфейс на основе HTML для отображения казней, истории событий и связей.
Распечатайте импорт и экспорт каждого компонента в формате WIT.
Разнородные наборы соединений, позволяющие одному набору соединений объединять несколько сигнатур функций и задержек.
Открыть файловую систему с сопоставлением каталогов для действий, веб-перехватчиков
Предоставлять конфигурацию сети для действий, веб-перехватчиков
Поддержка активности для действий, продление блокировки до завершения
Примеры с C#, Go, JS, Python
Идеи будущего
Интерактивный интерфейс командной строки для управления выполнением
Внешние действия gRPC API
Генератор активности OpenAPI
Создание процессов из действий WASM, чтение их результатов
Противодавление: ограничения на ожидающие очереди или стратегия выселения замедляются при LimitReached
Поддержка внешних исполнителей — запуск выполнения исключительно на основе экспорта WIT. Внешние исполнители должны иметь общий доступ на запись в базу данных sqlite.
Ярлыки, ограничивающие рабочие процессы/действия для исполнителей
Периодическое планирование
Крайний срок распространения
Распространение отмены
Настройка емкости очереди, добавление противодавления при отправке выполнения
Возможность моделирования поведения системы с внесенными сбоями.
Уведомлять о деятельности. При вызове третье возвращаемое значение должно быть предоставлено через конечную точку API.
API для составления списка исполнений с их действиями по открытому уведомлению.
Функция запроса только для чтения, которую можно вызвать во время точки ожидания или после завершения выполнения.
Интеллектуальная маршрутизация зависимостей от вызывающей стороны через импорт интерфейса к одному из многих компонентов, которые его экспортируют.
Интеллектуальные повторы — бюджет повторных попыток, отключение повторных попыток, когда действие завершается сбоем определенного процента запросов.
К повторным попыткам добавлен настраиваемый джиттер.
Снимки памяти рабочего процесса для более быстрого воспроизведения
Путешествующий во времени отладчик для рабочих процессов, работающий в развертываниях WASM.
Возможность исправления набора рабочих процессов с помощью системы одобрения при обнаружении недетерминированности.
Отслеживайте происхождение строк в рабочих процессах и действиях.
Сопоставления веб-перехватчиков: запуск одной функции, преобразование между определенными параметрами HTTP и WIT и возвращаемым значением.
Распределенная пересылка контекста трассировки для исходящего HTTP, а также веб-перехватчиков.
Разрешить указывать варианты постоянных ошибок в виде аннотаций в WIT.
Поддержка (распределенных) саг — определение откатов действий, вызов их в случае сбоя рабочих процессов.
Сборка из исходников
Настройте зависимости разработки с помощью nix-флейков:
nix develop
# or `direnv allow`, after simlinking .envrc-example -> .envrc
Или вручную загрузите все зависимости, см. dev-deps.txt и Dockerfile для проверки на основе Ubuntu. Запустите программу.
cargo run --release
Запуск тестов
./scripts/test.sh
Детерминированные тесты с использованием симулятора madsim
./scripts/test-madsim.sh
Содействие
У этого проекта есть дорожная карта, а функции добавляются и тестируются в определенном порядке. Если вы хотите внести свой вклад в какую-то функцию, обсудите эту функцию на GitHub. Чтобы мы могли принимать исправления и другие материалы, вам необходимо принять наше Лицензионное соглашение для участников («CLA»). Текущую версию CLA можно найти здесь.