Метархия - это технологический стек для быстрого создания безопасных, надежных и масштабируемых бэкендов корпоративного уровня с использованием JavaScript и Node.js. Ядром стека является сервер приложений impress (первый в мире ноды, реализовавший масштабирование на базе потоков worker_threads и изоляцию запросов на контекстах и замыканиях). В основу технологического стека положены такие принципы:
- Все, что можно автоматизировать и решить декларативным способом, должно решаться без написания кода.
- Слоеная (layered / onion) архитектура и DDD (domain-driven design) создает барьер между системным и прикладным кодом, так, что модель и прикладная логика имеют минимальное зацепление с технологическим стеком и полностью абстрагированы от деталей реализации (например, от сетевых протоколов).
- Минимум зависимостей и легковесность: сейчас библиотеки ядра весят 310кб, а все зависимости в примере https://github.com/metarhia/Example занимают 1.6мб, включая библиотеки Метархии, ws (вебсокеты) коннекторы к pg и redis.
- Максимальная простота написания прикладного кода, без необходимости углубляться в системное программирование и погружения в интеграцию библиотек с решением одних и тех же задач для каждого проекта. Другими словами, все необходимое сразу есть из коробки и все компоненты технологического стека уже собраны в одно целое.
- Принцип security by design и изоляция контекстов позволяют создавать на ноде приложения, удовлетворяющие требования к корпоративным системам по надежности и безопасности.
- Контрактное программирование на схемах и валидация контрактов в рантайме. Схемы поддерживают систему типов JavaScript и сами являются валидным JS кодом. Можно синтаксисом JavaScript описать модель предметной области и получить из нее структуру базы данных и структур данных в памяти, тайпинги для TypeScript, валидацию в API, метаданные для построения UI и т.д.
В Метархии нет мидлваров, нет доступа к req и res, не нужно заниматься роутингом
запросов (он автоматический), запрещены примеси (mixins), нет возможности
модифицировать глобальный контекст (global), нет require
. Другими словами
сделано все, чтобы было сложно написать утечку памяти или ресурсов, создать
состояние гонки, свалить процесс необработанными исключениями или реджектами
промисов.
В сервер приложений impress встроен механизм DI (dependency injection), но через DI контейнеры и не вручную (с передачей через зависимостей в конструкторы), а при помощи контекстов v8 и замыканий зависимости становятся видны в нужных местах кода автоматически.
Технологический стек состоит из следующих библиотек:
- impress - сервер приложений, поднимает и связывает все компоненты при старте, обеспечивает работу бизнес-логики, обработку ошибок, управление потоками, перезапуск, DI, изоляцию и управление зависимостями;
- metaschema - позволяет описывать структуры данных и контракты на подмножестве синтаксиса JavaScript и валидировать их в рантайме;
- metavm - обеспечивает загрузку кода в песочницы виртуальной машины v8;
- metasql - утилиты для работы с pg, генератор структуры базы, миграций, простой построитель запросов, средста валидации данных по схемам (доменной модели);
- metaconfiguration - загрузка конфигурации;
- metacom - протокол вызова удаленных процедур и трансляции событий;
- metawatch - слежение за файловой системой;
- metalog - логирование в файлы и консоль, буферизация и прокрутка логов;
- metautil - общие утилиты для всех модулей технологического стека.
- Автоматическая загрузка зависимостей, конфигурации, схем (модели предметной области), ресурсов, api и доменной логики;
- Живая подгрузка изменений из файловой системы на лету;
- Автоматический роутинг: для создания эндпоинта нужно положить функцию в файл;
- Таймауты и очереди на исполнение эндпоинтов;
- Отдача статики из оперативной памяти, что удобно для разработки, а при развертывании, конечно, статика должна отдаваться с CDN;
- Автоматическое масштабирование потоками: для каждого открытого порта создается поток, кроме того, в конфигурации указывается, сколько потоков нужно запустить дополнительно для бизнес-логики;
- Доступ к эндпоинтам через разные протоколы: HTTP, HTTPS, WS, WSS (скоро будут поддерживаться HTTP/2, HTTP/3, а так же TCP и TLS без HTTP);
- Встроенная система сессий с состоянием;
- Возможность создать кастомный модуль авторизации и аутентификации, который будет обеспечивать доступ к кастомной системе прав, хранящейся в памяти, базе данных или другом сервисе;
- Логирование через интерфейс
Console
т.е.console.log
и другими методами; - Поддержка graceful shutdown;
- Встроенный тестовый фреймворк;
- Управление потоком запросов (в конфигурации можно декларативно задать параметры очереди);
- Автоматическая обработка ошибок;
В ближайшее время будет реализовано:
- Мониторинг здоровья серверной инфраструктуры;
- Встроенный планировщик задач;
- Автоматическое управление состоянием между потоками в рамках сервера;
В отдаленной перспективе:
- Автоматическое управление распределенным состоянием;
- Node.js v12.9.0, v14.x или v16.x
- Linux (любой дистрибутив)
- Postgresql (опционально) начиная с 9.5 (v11.x предпочтительнее)
- OpenSSL v1.1.1 или более новый (опционально, для https & wss)
- certbot (рекомендован для создания криптографических сертификатов)