Все хотя бы раз в своей жизни слышали термин "кровавого энтерпрайза", но у каждого свое представление о его значении. В рамках данного стрима под энтерпрайз решениями понимаются решения обладающие следующими требованиями:

- многопользовательский режим (подразумевает одновременную работу пользователей,
 потенциально их может быть очень много);
- большой объем данных;
- долгосрочное хранение данных;
- устойчивость к сбоям и возможность восстановления;
- унификация интерфейса;
- интеграция с другими приложениями/системами.

Энтерпрайз - это всегда гетерогенная система, даже если в самом начале это не так, то со временем становится именно так.

Основные требования:

- масштабируемость
- время отклика (скорость с которой система понимает, что от нее требует пользователь)
- скорость реакции (время которая система тратит на выполнения полезных действий)
- время задержки (время на распространение данных по сети)

Формирование ограничений:

- максимальное количество единовременно работающих пользователей
- предельные значения отклика
- режим работы:
    - приближенный к реальному
    - интервальный принцип (относительно интервала времени)

Способы оценки

- аналитическая оценка
- эмпирическая оценка

Аналитическая оценка:

    - графический способ оценки
    - оценка по пиковому, среднему и минимальному значению
    - оценка в относительных единицах
        - IOPS - количество операций ввода-вывода в секунду
        - MIPS - миллионы инструкций в секунду
        - коэффициенты    
    - алгоритмическая сложность (BIG O нотация)

Эмпирическая оценка:

- замеры аналогичных решений
- прототипирование

Нагрузка по ресурсам (для аналитических методов):

- дисковая нагрузка - для оценки рассматриваются варианты реализации с учетом специфики решения:
    - линейное чтение
    - рандомное чтение
    - системы хранения данных (RAID, NAS и т.д.)
    - физические носители (HDD, SSD, RAM)
- вычислительная нагрузка
    - потребляемые инструкции (под нагрузкой, без нагрузки)
    - многопоточность/однопоточность 
    - коэффициент повышения производительности (закон Амдала)
- сетевая нагрузка

график закона

Часто для калькуляции производительности можно оттолкнуться от типовых оценок времени, которые можно выработать самостоятельно, или найти в сети, например в статье "Google Pro Tip: Use back-of-envelope-calculations To Choose The Best Design" приводились такие оценки:

Энтерпрайз архитектуры строятся на принципах параллельного выполнения, при этом целевые свойства системы достигаются путем применения принципа "разделяй и властвуй", когда система бьется на подсистемы, при этом для проектирования как правило используются следующие архитектуры:

- Сервис-ориентированная  архитектура
- Микросервисная архитектура
- Монолитная архитектура

В некотором смысле все заканчивается монолитом: микросервис - монолит, но при этом в системе может быть всего лишь один блок развертывания, который тоже будет являться монолитным.

Конечная единица проектирования, как правила реализуется в виде слоистого монолита, который удобнее всего выразить в трехслойной архитектуре.

Основная проблема - конкуренция за использование ресурсов.

Решается через:

В основном параллельность достигается за счет многосеансовой работы, второй вариант - конкурирующие системные процессы (этот вариант пока рассматривать не будем).

Для совместной работы нескольких пользователей в сеансовом подходе используется механизм параллельных заданий, который реализуется через механизм блокировок. Обычно формируется из небольших моно-задач, которые не имеют большого количества промежуточных состояний.

Блокировки бывают:

- оптимистичные - никого не блокируем, согласовываем конечный вариант 
по мере закрытия транзакций
- пессимистичный - блокировки до завершения  транзакции, при этом 
допускаются ситуации совмещения блокировок по типам:
    - чтение (предотвращение несогласованного чтения)
    - запись (предотвращение несогласованной записи)
    - полная

Для управления сложными действиями, которые могут состоять из нескольких этапов используются - транзакции. Транзакция может быть целиком размещена в слое предметной области (однофазные), а может распространяться по всей системе (многофазные)

По способу обработки:

- синхронные (ACID) - в основном используются для однофазных транзакций
- асинхронные (BASE) - в основном используются для много фазных транзакций

По назначению:

- служебные
- прикладные (бизнес)

По сути выбор сводится к способу обработки транзакций: ACID и BASE

ACID:

- Атомарность (Atomicity)
- Согласованность (Consistency)
- Изолированность (Isolation)
- Прочность (Durability)

BASE:

- базовая доступность (Basically Available)
- неустойчивое состояние (Soft-state)
- согласованность в конечном счёте (Eventually consistent)

CAP:

- Согласованность (Consistency)
- Доступность (Availability)
- Устойчивость к разделению (Partition tolerance)

AP - целостность в конечном итоге

Основной способ управляемого разделения компонентов сложной системы заключается в использовании "шлюзов". Шлюзы являются типовыми элементами, с которыми может взаимодействовать произвольный компонент системы. Таким образом все знают о шлюзе, но ничего не знают друг о друге. Это позволяет реализовать концепцию низкого зацепления.

Использование шлюзов помогает отделить способ получения от информации, от непосредственно получения. Таким образом конечные компоненты не содержат специфической логики связанной с реализацией сторонних компонент.

Шлюз может работать в одном из двух режимов:

- широковещательный - все сообщения передаются всем компонентам подключенным к шлюзу
- персональный - реализация "умного шлюза" который может точно установить кому адресовать данные

Способы взаимодействия:

- API (монолиты)
- Протокол (реактивная архитектура)

Наиболее распространенный подход - ООП. Часто прибегают к паттернам Фаулера:

Опасность: анемичная модель

На сегодняшний день стандартом является комбинирование NoSQL и SQL решений

Преимущества SQL:

Недостатки:

Преимущества NoSQL:

Недостатки:

Задачи для SQL:

Задачи для NoSQL: