Проектирование систем и архитектура
Объясните разницу между монолитной архитектурой и архитектурой микросервисов. Каковы плюсы и минусы каждого?
Ответ:
Монолитная архитектура представляет собой единое, тесно связанное приложение. Плюсы: проще в первоначальной разработке и развертывании. Минусы: сложно масштабировать, поддерживать и обновлять. Архитектура микросервисов — это набор небольших, слабо связанных сервисов. Плюсы: независимое развертывание, масштабируемость и разнообразие технологий. Минусы: повышенная сложность в разработке, развертывании и мониторинге.
Что такое CAP-теорема и как она связана с проектированием распределенных систем?
Ответ:
CAP-теорема гласит, что распределенное хранилище данных может гарантировать только два из трех свойств: Согласованность (Consistency), Доступность (Availability) и Устойчивость к разделению (Partition Tolerance). В распределенной системе при возникновении сетевого разделения необходимо выбрать, каким двум свойствам отдать приоритет. Большинство современных распределенных систем отдают приоритет Доступности и Устойчивости к разделению (AP) над строгой Согласованностью (CP).
Опишите различные типы алгоритмов балансировки нагрузки и их варианты использования.
Ответ:
Распространенные алгоритмы балансировки нагрузки включают Round Robin (последовательное распределение запросов), Least Connections (отправка на сервер с наименьшим количеством активных соединений) и IP Hash (распределение на основе IP-адреса клиента). Round Robin прост для равномерных нагрузок. Least Connections хорошо подходит для запросов с разным временем обработки. IP Hash обеспечивает «прилипание» сессии без явного управления сессиями.
Что такое конечная согласованность (eventual consistency) и где она обычно используется?
Ответ:
Конечная согласованность — это модель согласованности, при которой, если для данного элемента данных не поступает новых обновлений, в конечном итоге все обращения к этому элементу будут возвращать последнее обновленное значение. Она обычно используется в высокодоступных распределенных системах, таких как базы данных NoSQL (например, Cassandra, DynamoDB) и DNS, где немедленная согласованность не критична, а приоритет отдается доступности.
Объясните концепцию горизонтального и вертикального масштабирования.
Ответ:
Вертикальное масштабирование (scaling up) означает добавление большего количества ресурсов (CPU, RAM) к существующему серверу. Это проще, но имеет ограничения. Горизонтальное масштабирование (scaling out) означает добавление большего количества серверов для распределения нагрузки. Оно обеспечивает большую масштабируемость и отказоустойчивость, но добавляет сложность в управлении распределенными системами.
Что такое очереди сообщений и почему они используются при проектировании систем?
Ответ:
Очереди сообщений (например, Kafka, RabbitMQ) обеспечивают асинхронную связь между различными частями системы. Они разделяют сервисы, буферизуют запросы во время пиковых нагрузок, повышают отказоустойчивость за счет повторных попыток выполнения неудачных операций и облегчают создание событийно-ориентированных архитектур. Это повышает масштабируемость и надежность.
Как вы обрабатываете шардинг/партиционирование баз данных? Каковы его преимущества и проблемы?
Ответ:
Шардинг базы данных включает разделение большой базы данных на более мелкие, управляемые части (шарды) на нескольких серверах. Преимущества включают улучшенную масштабируемость, производительность и изоляцию отказов. Проблемы включают повышенную сложность в распределении данных, маршрутизации запросов, соединениях между шардами и перебалансировке.
Что такое CDN (Content Delivery Network) и как она улучшает производительность системы?
Ответ:
CDN — это географически распределенная сеть прокси-серверов и центров обработки данных. Она улучшает производительность системы, кэшируя статический контент (изображения, видео, CSS, JS) ближе к конечному пользователю, уменьшая задержку и снижая нагрузку на исходный сервер. Это приводит к более быстрой доставке контента и лучшему пользовательскому опыту.
Обсудите важность идемпотентности в дизайне API для распределенных систем.
Ответ:
Идемпотентность означает, что операцию можно выполнить несколько раз без изменения результата после первого применения. В распределенных системах, где проблемы с сетью или повторные попытки являются обычным явлением, идемпотентные API предотвращают непреднамеренные побочные эффекты (например, дублирование платежей), если запрос отправляется несколько раз. HTTP-методы, такие как GET, PUT и DELETE, по своей природе идемпотентны.
Что такое паттерн «предохранитель» (circuit breaker) и когда его следует использовать?
Ответ:
Паттерн «предохранитель» предотвращает многократные попытки системы выполнить операцию, которая, вероятно, завершится неудачей, тем самым экономя ресурсы и предотвращая каскадные сбои. Он отслеживает вызовы к сервису; если сбои превышают пороговое значение, он «срабатывает» (открывается), предотвращая дальнейшие вызовы в течение определенного периода. Он используется при интеграции с внешними или ненадежными сервисами.
Объясните концепцию кэширования в проектировании систем. Каковы различные стратегии кэширования?
Ответ:
Кэширование хранит часто используемые данные во временном, более быстром хранилище для уменьшения задержки и нагрузки на базу данных. Стратегии включают: Write-Through (запись в кэш и БД одновременно), Write-Back (запись в кэш, затем асинхронно в БД) и Cache-Aside (приложение управляет чтением/записью в кэш, сначала проверяя кэш). Политики вытеснения, такие как LRU (Least Recently Used — наименее недавно использованный), также имеют решающее значение.