# Лабораторная работа №8 – Про устройство распределенных систем

## Задание 

Написать небольшое эссе (буквально несколько абзацев) своими словами.

- Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
- Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
- Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
- Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
- Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.

Распределенные системы, такие как социальные сети, создаются в виде отдельных сервисов, каждый из которых выполняет ограниченный спектр задач. Это обеспечивает масштабируемость, отказоустойчивость и возможность гибкой настройки под разный функционал. Крупные системы, как ВКонтакте, выбирают подобный подход, поскольку он позволяет масштабировать определенные компоненты (например, хранилище данных или сервис загрузки медиа), не затрагивая другие части системы. Это особенно важно при резком увеличении числа пользователей, поскольку узлы могут работать независимо друг от друга.

Системы оркестрации, такие как Kubernetes, автоматизируют управление контейнеризированными приложениями, что упрощает их развертывание, управление и масштабирование. Оркестрация снижает сложность сопровождения, позволяя разработчикам сосредоточиться на разработке кода, а не на решении инфраструктурных задач. Вместе с тем, это требует от команды знаний в области контейнеризации и управления инфраструктурой, что добавляет сложности в освоении системы.

Очереди сообщений (например, RabbitMQ или Kafka) необходимы для организации обмена сообщениями между компонентами распределенной системы. Под сообщениями могут подразумеваться запросы, события или данные, которые один компонент передает другому для обработки. Такие очереди помогают обеспечить асинхронную обработку данных, что позволяет системе масштабироваться и поддерживать высокую производительность.

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

Параллельные вычисления целесообразны для задач, требующих высокой производительности, например, для обработки больших объемов данных. Однако их не всегда оправданно использовать в системах с малой степенью зависимости между задачами, поскольку это может усложнить архитектуру и сопровождение.