SlideShare a Scribd company logo
Эволюция архитектуры
многогранного Node.js
проекта
• Как жить в условиях работы с
большим количеством данных и
вычислений?
• Как можно организовать
самодокументацию и контракты?
• Важность выбора стека под задачу
• Как управлять техдолгом в условиях
миграции технологий
О чем поговорим?
Реалии типичного
стартапа
Высокий темп
разработки
Ограниченный бюджет
на поддержание
инфраструктуры
Маленькая команда
байдарки
мы работаем за еду,
А кто такой Koyfin, простите?
ПОЕХАЛИ!
MVP
● MonoRepo архитектура
● База не справляется с
нагрузкой
● Блокировка Event Loop`a
● Server-side рендер
База данных
● Блокировка чтения записью из
множества источников
● Переполнение ОЗУ огромным
кол-вом индексов
● Нулевая отказоустойчивость
● Вывести клиент в отдельное приложение
● Реплицировать базу данных (и станет хорошо)
● Наконец-то прикрутить eslint
● А что же с Event Loop?...
Sounds like a plan
Микросервисы
Просто разрежьте на логические
части
(для начала)
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
Как организовать?
1. Писать в БД может только один сервис
2. Поток записи данных должен быть
однонаправленный
3. Если кому-то нужны данные - выдаем права в БД
только на чтение
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
Новые проблемы...
● Большое количество микросервисов, которые общаются друг с другом
● Разный формат сообщений
● Нужно иметь возможность разрабатывать части системы параллельно
разными разработчиками
Необходимо договориться
Основная идея контрактного
программирования — это модель
взаимодействия элементов
программной системы, основывающаяся
на идее взаимных обязательств и
преимуществ. Как и в бизнесе, клиент и
поставщик действуют в соответствии с
определенным контрактом.
(Википедия)
«TypeScript - это JS для Jav’истов»
© Конфуций, 2018 год
Внедрение типизации
Тестирование идеи
Тестирование идеи
1. Пишем TypeScript интерфейсы для взаимодействия
между микросервисами
1. Пишем TypeScript интерфейсы для взаимодействия
между микросервисами
1. Определяем типы переменных в функциях через
JSDoc блоки внутри JS кода
Тестирование идеи
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
1. Пишем TypeScript интерфейсы для взаимодействия
между микросервисами
1. Определяем типы переменных через интерфейсы в
функциях через JSDoc блоки внутри JS кода
1. Ставим на precommit вызов TypeScript компилятора и
делаем его частью обязательных тестов для коммита
Тестирование идеи
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
Precommit Hook
Полный переход на TS
Полный переход на TS
1. Использование декораторов для краткости и
элегантности
Простая мемоизация
Простая мемоизация
Routing-controllers
● Декларативность
● Простота композиции
● Инъекция важных частей
запроса прямо в функцию
( User, Body, etc. )
Валидация
www.koyfin.com
if(usersSeesCapture() ===
){
alert(‘Похоже у
нас невалидные данные!’)
}
Первая версия валидации
Вторая версия валидации
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
JSON Schema:
83 строки
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
Полный переход на TS
• Использование декораторов для краткости и
элегантности
• Генерация схемы валидации (JSON schema) из TS
интерфейсов
TS Interface
20 строк
typescript-json-schema ./src/validation/tsconfig.json "*"
-o "./src/validation/validations.json"
--required=true
--strictNullChecks=true
--noExtraProps=true
--noExtraItems=true
ТЕХНИЧЕСКИЙ ДОЛГ?
9999999
Давай, расскажи мне про миграцию на TS
MyCompany
Смешивание кода
“allowJs”: true - легкий путь к
“плавной” миграции
РАСЧЕТЫ
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
Подходы оптимизации
расчетов
● Precalculated data
● Мемоизация
● Логический кеш + Warm Up
✚ Данные считаются на этапе записи в БД
Precalculated data
✚ Данные считаются на этапе записи в БД
● процедуры + триггеры в БД
● логика при записи
● отдельные воркеры, которые по событию
или расписанию производят пересчет
Precalculated data
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта
✚ Данные считаются на этапе записи в БД
✚ Не нагружаем БД и мозг сложными запросами
✚ Отличная производительность
Precalculated data
✖︎ При обнаружении ошибок в данных - нужно
проводить полный перерасчет производных
✖︎ Денормализация и дублирование
✖︎ Тяжело отслеживать место возникновения
ошибок в расчетах
Precalculated data
✚ Данные считаются на лету
✚ При выявлении ошибок в расчетах или исходных
данных - достаточно просто сбросить кеш
✚ Неплохая производительность
Мемоизация
✖︎ Все еще CPU-intensive задача
✖︎ Плохо работает для часто обновляемых данных
✖︎ Нужно думать о соблюдении порядка аргументов
Мемоизация
✚ Данные считаются на лету
✚ Кеш проще переиспользовать, чем при
мемоизации
✚ Простая инвалидация при обновлении исходных
данных
✚ Отлично подходит для постоянно обновляемых
данных
Логический кеш
✖︎ Занимает много места
✖︎ Нужно реализовывать логику под каждый кейс
✖︎ Нужно прогревать
Логический кеш
В условиях работы с большим количеством данных вы
можете разделять логику вычислений по разным слоям
инфраструктуры и использовать приемы мемоизации и
кеширования результатов.
Выводы
Рассмотрите типизированные языки для организации
контрактов обмена данными и написания более
самодокументированного кода
Выводы
Решайте проблемы на правильных уровнях.
Выводы
Техдолг не волк - в лес не убежит.
Используйте плавную миграцию и заботьтесь в
первую очередь о потребностях бизнеса.
Выводы
Всем крепких костылей!

More Related Content

PDF
Web performance 101 [GDG nsk webdev meetup #3]
PDF
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
PPTX
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
PDF
Moбильная база данных Realm. Прошло ли время SQLite?
PPTX
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
PDF
Борис Каплуновский, Aviasales.ru
PDF
Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если на...
PDF
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Web performance 101 [GDG nsk webdev meetup #3]
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Moбильная база данных Realm. Прошло ли время SQLite?
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Борис Каплуновский, Aviasales.ru
Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если на...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...

What's hot (20)

PDF
maps.sputnik.ru #highload2014
PPTX
Jinba - frontendconf.ru/2015
PPT
Redis: возможности, выгоды, примеры использования
PPTX
Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
PPTX
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
PDF
Cоздаем пробки или тюнинг postgresql для расчетных задач
PDF
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PDF
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
PDF
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
PPTX
Мониторинг всех слоев web проекта (hl2015)
PPTX
Как правильно делать анимацию и добиться 60fps на различных девайсах | Odessa...
PDF
Профилирование Node.js
PPTX
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
PDF
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
PDF
Cергей Коржнев, 2ГИС
PDF
Twisted Framework - сетевые приложения в Python
PDF
pgconf.ru 2015.avito postgresql recovery
PDF
Smirnov Twisted Python
PPTX
Диагностика postgresql для системного администратора
maps.sputnik.ru #highload2014
Jinba - frontendconf.ru/2015
Redis: возможности, выгоды, примеры использования
Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Cоздаем пробки или тюнинг postgresql для расчетных задач
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
Мониторинг всех слоев web проекта (hl2015)
Как правильно делать анимацию и добиться 60fps на различных девайсах | Odessa...
Профилирование Node.js
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
Cергей Коржнев, 2ГИС
Twisted Framework - сетевые приложения в Python
pgconf.ru 2015.avito postgresql recovery
Smirnov Twisted Python
Диагностика postgresql для системного администратора
Ad

Similar to JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта (20)

PDF
CQRS на практике. В поиске точки масштабирования и новых метафор
PDF
Node.js for enterprise 2021 - JavaScript Fwdays 3
PDF
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
PDF
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
PPTX
Построение собственного JS SDK — зачем и как?
PDF
Теории и практики функционального программирования.
PDF
Теории и практики фунционального программирования - GDG D2D
PPTX
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
PPTX
Coding like a sex
PPTX
Windows Azure and node js
PDF
Переход от монолитной архитектуры к распределенной
PPTX
Переход от монолитной архитектуры к распределенной
PDF
Моделирование для NoSQL БД
PDF
Серверный JavaScript: NodeJS и CouchDB
PDF
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
PDF
Объектное и прототипное программирование в Javascript
PPTX
Как пройти собеседование и получить первую работу на Swift
PPT
Web весна 2012 лекция 6
PDF
C# Web. Занятие 04.
PPTX
разработка бизнес приложений (7)
CQRS на практике. В поиске точки масштабирования и новых метафор
Node.js for enterprise 2021 - JavaScript Fwdays 3
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Построение собственного JS SDK — зачем и как?
Теории и практики функционального программирования.
Теории и практики фунционального программирования - GDG D2D
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Coding like a sex
Windows Azure and node js
Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределенной
Моделирование для NoSQL БД
Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Объектное и прототипное программирование в Javascript
Как пройти собеседование и получить первую работу на Swift
Web весна 2012 лекция 6
C# Web. Занятие 04.
разработка бизнес приложений (7)
Ad

More from JSFestUA (20)

PDF
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
PDF
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
PDF
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
PDF
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
PDF
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
PDF
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
PPTX
JS Fest 2019/Autumn. Александр Товмач. JAMstack
PPTX
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
PPTX
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
PPTX
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
PPTX
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
PPTX
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
PPTX
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
PDF
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
PPTX
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
PDF
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
PDF
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
PPTX
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
PPTX
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
PPTX
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...

JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогранного Node.js проекта

Editor's Notes

  • #11: ??????
  • #12: Поговорим о структуризации приложения, про жесткое разделение ответственности на запись и единый источник правды на чтение
  • #14: Главный вопрос который возникает при обнаружении неправильных данных - откуда они взялись, как посчитались и как записались в БД Гораздо проще следить за всем этим и дебажить, когда принят принцип единой ответственности на запись и мутацию данных - это должен быть один сервис на один тип данных. Раньше такие менеджеры данных были ответственны и за их предоставление другим сервисам, но с течением времени мы договорились, что гораздо удобнее уметь читать из БД напрямую, особенно когда нужно произвести сложные и специфичные агрегации. Конвеерный подход позволил нам легко добавлять мутации и направлять данные как нам удобно быстро и без особых струдностей (пример про живые данные)
  • #16: Из предыдущего спича возникает новая проблема
  • #17: НАМ. НУЖНЫ. СМАРТ - КОНТРАКТЫ
  • #18: Мы посмотрели в сторону TypeScript. Мы решили, что если будем иметь репозиторий, в котором описаны протоколы сообщений для взаимодействия частей системы - это решит нашу проблемы. TypeScript позволил нам провести тетсирование идеи очень быстро