Skip to content

Commit

Permalink
Add introduction
Browse files Browse the repository at this point in the history
  • Loading branch information
tshemsedinov committed Jun 8, 2021
1 parent fed3c4d commit 33dd37d
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 0 deletions.
1 change: 1 addition & 0 deletions ru/INDEX.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Технологический стек Метархия

- [Введение](INTRO.md)
- [Быстрый старт](START.md)
- [Структура приложений](APPLICATION.md)
- [Документация внешних нтерфейсов](DOCS.md)
Expand Down
108 changes: 108 additions & 0 deletions ru/INTRO.md
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 (рекомендован для создания криптографических сертификатов)

0 comments on commit 33dd37d

Please sign in to comment.