Система оркестрации чистых преобразований данных на основе графа зависимостей
1. Основная идея
- Система превращает приложения в набор запросов к пакетам, а пакеты — в чистые функции
inputs → outputs. - Для выполнения запросов система строит DAG (ориентированный ациклический граф) зависимостей пакетов.
- Каждое приложение не содержит кода пакетов. Оно:
- хранит локальное состояние приложения (например, переменные, настройки, промежуточные результаты для консольных приложений);
- формирует запросы к пакетам;
- Управляет историей DAG — графом преобразований данных, используемых приложением.
2. Пакеты
2.1 Содержимое пакета
- Набор бинарников для разных архитектур и конкретных процессоров, включая варианты с поддержкой инструкций (SSE, AVX, NEON и т.п.).
- Манифест, содержащий:
- UUID входных и выходных типов данных,
- описание пакета,
- контакты разработчиков,
- версию пакета.
2.2 Граф совместимости архитектур
- Определяет, какие бинарники могут запускаться на каких процессорах;
- Поддерживаемые наборы инструкций;
- Возможность запуска бинарника на более широкой архитектуре (например, x86 может выполняться на x86_64).
2.3 Принципы работы
- Чистота пакета:
- Пакет может только читать входные данные (inputs);
- Пакет может только записывать выходные данные (outputs);
- Пакет не имеет доступа к состоянию приложений или других пакетов;
- Каждый input и output имеет свой тип данных (UUID);
- Результат работы пакета полностью определяется входными данными и типом выходного значения;
- Общий кеш системы: outputs сохраняются в кеш, идентифицируемый комбинацией UUID всех входных данных и UUID типа выходных данных;
- Альтернативные реализации: при нестабильной или неэффективной работе система выбирает другую реализацию с теми же входными и выходными типами.
3. Входные и выходные данные
3.1 Типы данных
- Каждый тип данных имеет собственный UUID, описание и контакты разработчиков.
- Примеры типов:
TextFile,Image,SensorReading,UIElement.
3.2 Экземпляры данных (inputs/outputs)
- Каждый вход и выход пакета связан с конкретным типом данных.
- Пакет может принимать несколько входов и создавать несколько выходов.
- Все входные данные доступны только для чтения.
- Выходные данные помещаются в общий системный кеш.
- Идентификация результатов: комбинация UUID всех входных данных и UUID типа выходного значения.
3.3 Особенности
- DAG зависимостей строится по связям между типами данных пакетов.
- Система автоматически управляет параллельным выполнением, когда одни выходы используются в нескольких ветвях графа.
- Кеш предотвращает повторные вычисления, обеспечивая высокую эффективность.
- Каждый пакет ведёт себя как чистая функция, без побочных эффектов.
4. Приложения
4.1 Состав
- Входные данные от внешних источников — драйверов, пользователя, сети, датчиков и т.п.
- Локальное состояние приложения, ассоциированное с экземпляром приложения: хранит привязки
inputs → outputs, переменные, настройки, временные данные и другие параметры, необходимые только этому экземпляру. - Принципы:
- Приложения не содержат кода пакетов, они лишь управляют потоками данных и вызывают нужные пакеты через систему.
- Для GUI используются пакеты визуализации, которые получают данные для отрисовки как обычные входные данные (
UIElementи т.п.). - Приложения различаются в основном по структуре запросов и набору используемых типов данных, а не по двоичному коду.
5. Общие черты системы
- Общий кеш промежуточных результатов: одинаковые входные данные и тип выходного значения дают один и тот же результат для всех приложений.
- Автоматический выбор реализации пакета на основе глобальной статистики стабильности и производительности.
- Параллельная обработка: результаты одного пакета могут одновременно использоваться многими другими.
- Автоматическая устойчивость к ошибкам: при сбоях система выбирает альтернативную реализацию.
- Детерминированность: каждый результат (
output) однозначно определяется комбинацией входных данных и типа выходного значения.
6. Состояние приложения
- Приложение хранит своё локальное состояние как итеративное кольцо
input → output, обновляемое на основе событий от драйверов (пользовательский ввод, сеть, датчики и т.п.). - Каждое событие от драйвера добавляет новый input в кольцо, обрабатываемое через соответствующие пакеты системы.
- Результаты обработки (
outputs) помещаются в локальное состояние приложения и/или в общий кеш системы, если они могут использоваться другими пакетами или приложениями. - Состояние приложения является циклической структурой событий и их результатов, управляемой приложением и чистыми пакетами.
- Локальное состояние хранит:
- переменные и настройки приложения;
- промежуточные результаты вычислений для текущего экземпляра приложения;
- историю DAG вызовов пакетов, связанных с этим приложением.
7. Сравнение с традиционными системами пакетов
| Признак | Традиционные пакеты (rpm, deb) | Система на графах |
|---|---|---|
| Что такое приложение | Исполняемая программа с зависимостями | Набор запросов к пакетам + локальное состояние |
| Зависимости | Жёстко определены при установке | Строятся динамически по типам данных |
| Состояние | Может храниться внутри пакета | Только в приложении |
| Кеш | Локальный для программы | Общий для всей системы |
| Выбор версии | Ручной, фиксированный | Автоматический по статистике |
| UI | Встроен в код приложения | Через пакеты отрисовки UI |
| Ошибки пакета | Могут нарушить работу приложения | Автоматический выбор альтернативы |
| Совместимость | Зависит от архитектуры и сборки | Граф совместимости архитектур и инструкций |
| Множественные inputs/outputs | Обычно отсутствуют | Поддерживаются и описаны через UUID типов |
| Идентификация результата | По имени файла или версии | По UUID входных данных + UUID типа результата |
Краткое описание
Приложение — это набор запросов к пакетам и локальное состояние,
пакеты — чистые преобразователи данных,
результаты и кеш — общие для всей системы.
Система сама выбирает наиболее эффективные и стабильные реализации пакетов, управляет потоками данных, визуализацией и устойчивостью к ошибкам.








