## Лабораторная работа №8 ПИбд-42 Артамоновой Татьяны

### Эссе на тему "Устройство распределенных систем"

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

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

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

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

Внедрение параллельных вычислений в сложную распределенную систему имеет смысл, 
если есть задачи, которые можно разбить на независимые подзадачи, решаемые параллельно. 
Например, обработка больших объемов данных или выполнение ресурсоемких 
вычислений. Однако, если система ограничена I/O операциями, 
параллельные вычисления могут не дать значительного выигрыша 
в производительности из-за "узких мест" в других частях системы. В таких случаях, 
оптимизация I/O операций может быть эффективнее, чем добавление параллелизма.