Архитектуры ИС
Уровни доступности (надежности) availability level
Надежность - система должна продолжать
работать корректно даже при
неблагоприятных обстоятельствах
Availability Level Average Yearly Downtime
Conventional Server 99% 87 hours, 40 minutes
Public Cloud Service 99.5% 43 hours, 50 minutes
99.9% 8 hours, 46 minutes
High-Availability Cluster 99.95% 4 hours, 23 minutes
Virtual Fault Tolerance 99.995% 26 minutes, 18 seconds
Continuous Availability 99.999% 5 minutes, 16 seconds
The Stratus Zone 99.9999% 31.6 seconds
SLA / SLO / SLI
Основные критерии систем
Latency на чтение с разных типов дисков
Low-latency приложения - такие приложение надо с самого начала писать с оптимизациями, с прямой ориентацией на low-latency. Подход, когда пишут сначала просто работающее приложение, а потом оптимизируют его, здесь не работает
Throughput (пропускная способность дисков)
High-throughput приложения - приложения, заточенные под максимально возможную пропускную способность – latency в этом случае часто пренебрегают
Типы нагрузки
OLTP (online transaction processing)
OLAP (online analytics processing)
Микросервисы (плюсы/минусы)
Плюсы:
* Независимые релизы и разработка и быстрый CI/CD
* Независимая масштабируемость (только нужные сервисы)
* Независимая деградация (устойчивость к отказам)
* Технологическая свобода (возможность использовать разные технологии)
Минусы:
* Зоопарк технологий
* Сетевой вызов отвалится вероятнее, чем внутренний
* Распределенность и транзакционность
* Удаленные вызовы дороже локального исполнения
* Понимание всего контекста запроса
* Сложность тестирования всей системы
Плюсы:
✅ Гибкость и независимость – каждый сервис можно разрабатывать, тестировать и деплоить отдельно.
✅ Масштабируемость – можно масштабировать только нужные сервисы под нагрузку.
✅ Технологическая свобода – разные сервисы могут быть написаны на разных языках/фреймворках.
✅ Устойчивость к отказам – падение одного сервиса не всегда приводит к падению всей системы.
✅ Быстрый CI/CD – изменения в одном сервисе не требуют пересборки всей системы.
Минусы:
❌ Сложность разработки – нужно учитывать межсервисное взаимодействие (API, версионирование, ошибки).
❌ Распределенные транзакции – сложно обеспечить согласованность данных (нужны Saga, Event Sourcing и т. д.).
❌ Накладные расходы – сетевые задержки, сериализация/десериализация, нагрузка на Service Discovery.
❌ Сложность отладки – трассировка запросов между сервисами требует дополнительных инструментов (Jaeger, Zipkin).
❌ Оркестрация и DevOps – нужны Kubernetes, Docker, мониторинг, логирование, что усложняет инфраструктуру.
Монолит (плюсы/минусы)
Плюсы:
✅ Простота разработки – единая кодовая база, нет сложностей с межсервисным взаимодействием.
✅ Легкость тестирования – можно запускать интеграционные тесты без необходимости разворачивать множество сервисов.
✅ Простота деплоя – один артефакт (например, WAR/JAR-файл), который нужно развернуть.
✅ Согласованность транзакций – ACID-транзакции работают в рамках одной БД.
✅ Нет накладных расходов на межсервисную коммуникацию – все вызовы локальные.
Минусы:
❌ Масштабируемость – сложно масштабировать отдельные части системы, приходится масштабировать весь монолит.
❌ Гибкость технологий – сложно использовать разные языки/фреймворки для разных модулей.
❌ Риск “спагетти-кода” – при плохой архитектуре кодовая база быстро становится запутанной.
❌ Медленный CI/CD – даже при небольшом изменении нужно пересобирать и передеплоить весь монолит.
❌ Единая точка отказа – падение сервиса приводит к недоступности всей системы.
Монолит vs Микросервисы (что выбрать)
Балансировка нагрузки
Проксирование (функции)
Типы прокси
Forward Proxy
Плюсы:
✅ Анонимность – скрывает IP клиента от сервера.
✅ Обход блокировок – может использоваться для доступа к заблокированным ресурсам.
✅ Кэширование – ускоряет загрузку часто запрашиваемых данных.
✅ Контроль трафика – корпоративные прокси могут блокировать доступ к определенным сайтам.
Минусы:
❌ Замедление скорости (если прокси перегружен).
❌ Некоторые сайты блокируют известные прокси.
Примеры использования:
* Корпоративные сети (ограничение доступа сотрудников).
* VPN-сервисы (анонимизация трафика).
* Прокси для обхода географических блокировок.
Reverse Proxy
Плюсы:
✅ Балансировка нагрузки – распределяет запросы между серверами.
✅ Кэширование – ускоряет отдачу статического контента.
✅ Защита бекендов – скрывает реальные серверы, фильтрует атаки (DDoS, SQL-инъекции).
✅ SSL/TLS Termination – разгружает бекенды, обрабатывая шифрование на себе.
✅ Маршрутизация – может перенаправлять запросы в зависимости от URL (API, статика, микросервисы).
Минусы:
❌ Единая точка отказа (нужна отказоустойчивость).
❌ Дополнительная задержка (если прокси перегружен).
Примеры использования:
* Веб-серверы (Nginx, Apache как reverse proxy для бекенда).
* CDN (раздача контента с ближайших серверов).
* API Gateway в микросервисных архитектурах.
Кэширование (для чего)
По хорошему, нужно уметь держать нагрузку без кэша.
Задача кэша – ускорить ответ, а не держать нагрузку.
Термины кэширования
Какие данные кэшировать
Кеширование ошибок
Кэшируем ошибки и тогда последующие запросы не
будут обращаться к источнику информации, а также не
будет cache miss attack
Как понять эффективен ли кэш
AverageTime = DBAccessTime * CacheMissRate + CacheAccessTime
Пусть:
- DBAccessTime = 100ms
- CacheAccessTime = 20ms
Тогда при CacheMissRate > 0.8 – кэш вреден!
Виды кэширования
Способы взаимодействия с кэшем
Алгоритмы вытеснения данных
Другие:
* Алгоритм Белади (OPT) - теоретический (если мы знаем когда будет обращение к элементу)
* Second Chance (FIFO с выставленным битом used)
* Clock (Тот же Second Chance, только не нужно двигать элемент из начала в конец очереди, если бит равен единице)
* 2Q
* SLRU (к данным добавляется их время жизни в кэше (TTL), по которому они автоматически удаляются из кэша)
* LRU-k
API