5. Принципы проектирования систем (Middle+)
Middle
Что такое проектирование систем и почему это важно?
Ответ: Проектирование систем — это процесс определения архитектуры, компонентов, модулей, интерфейсов и данных системы для удовлетворения заданных требований. Это важно, потому что грамотно спроектированная система может эффективно масштабироваться, устойчиво обрабатывать сбои и экономично обслуживаться. Неудачное проектирование может привести к огромным финансовым потерям и масштабным отказам.
В чём разница между функциональными и нефункциональными требованиями?
Ответ:
- Функциональные требования: Определяют, что система должна делать. Это конкретные функции, например «пользователь может забронировать самокат» или «пользователь может просмотреть историю поездок».
- Нефункциональные требования: Определяют, как система должна работать. Включают такие характеристики, как масштабируемость (обработка 100 тысяч запросов), доступность (99,9% uptime), надёжность и безопасность.
Объясните вертикальное и горизонтальное масштабирование.
Ответ:
- Вертикальное масштабирование (Scaling Up): Увеличение мощности одного сервера (например, добавление CPU, RAM или более быстрых SSD). Просто в реализации, но ограничено физическими возможностями одной машины и становится очень дорогим на верхних уровнях.
- Горизонтальное масштабирование (Scaling Out): Добавление новых серверов в пул и распределение нагрузки между ними с помощью балансировщика нагрузки. Позволяет практически неограниченный рост и обеспечивает лучшую отказоустойчивость, так как система продолжает работать при отказе одного узла.
Каковы основные стратегии м асштабирования баз данных?
Ответ:
- Репликация: Создание копий базы данных (Master/Slave). Обычно Master обрабатывает запись, а Slave-серверы обрабатывают запросы на чтение для распределения нагрузки.
- Шардирование: Распределение данных по нескольким независимым серверам баз данных (шардам) на основе определённого ключа (например, User ID, геолокация). Каждый шард хранит подмножество общих данных.
- Партиционирование: Разделение большой таблицы на меньшие, более управляемые логические части внутри одного экземпляра базы данных для повышения производительности запросов.