# Отчет. Лабораторная работа 4 ## Описание В ходе лабораторной работы были изучены главы туториала о работе с RabbitMQ. Результат выполнения заданий каждой главы отражен на скриншотах в папке /images: - Tutorial-Task1.png ![Tutorial-Task1](images/Tutorial-Task1.png) - Tutorial-Task2.png ![Tutorial-Task2](images/Tutorial-Task2.png) - Tutorial-Task3.png ![Tutorial-Task3](images/Tutorial-Task3.png) Задание из 3-ей главы туториала было расширено условиями, которые были поставлены в задании к данной лабораторной работе. Для демонстрации работы сервисов посредством ассинхронного общения через брокер сообщений RabbitMQ была выбрана предметная область "Обработка заказов". Сервис-издатель "Publisher" публикует в очередь сообщений событие поступления заказа с некоторым номером. Сервисы-подписчики обрабатывают сообщения о заказах, при этом подписчики обрабатывают сообщение по-разному. Один вид подписчика обрабатывает с задержкой в несколько секунд, другой - "мгновенно", они получают одни и те жа сообщения, но соединены с разными очередями. В качестве эксперимента изначально были запущены по одному экземпляру каждого вида. На изображении Consumer2.png представлена работа мгновенно обрабатывающего подписчика. Он справляется с нагрузкой, так как размер очереди не растет. ![Consumer 2](images/Consumer2.png) На изображении Consumer1.png представлена работа подписчика, обрабатывающего сообщения с задержкой. Как мы видим, в очереди накапливаются сообщения в состоянии 'Ready' - эти сообщения готовы для того, чтобы быть доставленными подписчикам. Сервис не справляется с нагрузкой, так как отправляются сообщения быстрее, чем обрабатываются. ![Consumer 1](images/Consumer1.png) Для того, чтобы обеспечить равную скорость отправки и обработки, увеличиваем количество экземпляров-подписчиков данного типа до трех. На изображении видно, что теперь длина очереди не растет и система справляется с поступающими сообщениями. Также скорость "publish" и "consumer ack" стали равны. ![Consumer 1](images/Consumer1-scaling.png) ## Как запустить Для того, чтобы запустить сервисы, необходимо выполнить следующие действия: 1. Установить и запустить Docker Engine или Docker Desktop 2. Через консоль перейти в папку, в которой расположен файл docker-compose.yml 3. Выполнить команду для запуска брокера сообщений rabbitmq: ``` docker compose up rabbit -d ``` 4. Выполнить команду для запуска остальных контейнеров: ``` docker compose up -d ``` Такой порядок запуска важен для того, чтобы брокер сообщений успел полностью запуститься и произвести действия для того, чтобы быть готовым принимать соединения от сервисов. Потому что указания depends_on не хватает для отслеживания завершения всех необходимых подготовительных процессов брокера. ## Видео-отчет Работоспособность лабораторной работы можно оценить в следующем [видео](https://disk.yandex.ru/i/G0vsfp7vwazYHw).