forked from metarhia/Docs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
fed3c4d
commit 33dd37d
Showing
2 changed files
with
109 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
# Введение в технологический стек Метархия | ||
|
||
## Концепция | ||
|
||
Метархия - это технологический стек для быстрого создания безопасных, надежных и | ||
масштабируемых бэкендов корпоративного уровня с использованием 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 (рекомендован для создания криптографических сертификатов) |