# Кашин Максим ПИбд-42 ## RabbitMQ tutorial - "Hello world!" #### Работа файла receive ![receive_1.png](RabbitMQ_tutorial_1/report/receive_1.png) #### Работа файла send ![send_1.png](RabbitMQ_tutorial_1/report/send_1.png) ## RabbitMQ tutorial - Work Queues #### Работа файла new_task ![new_task_1.png](RabbitMQ_tutorial_2/report/new_task_1.png) #### Работа файла worker ![worker_1.png](RabbitMQ_tutorial_2/report/worker_1.png) #### Работа файла worker (запущенная копия) ![worker_2.png](RabbitMQ_tutorial_2/report/worker_2.png) ## RabbitMQ tutorial - Publish/Subscribe #### Работа файла receive_logs ![receive_logs_1.png](RabbitMQ_tutorial_3/report/receive_logs_1.png) ##### Работа файла emit_log ![emit_log_1.png](RabbitMQ_tutorial_3/report/emit_log_1.png) ##### Работа файла emit_log (запущенная копия) ![emit_log_2.png](RabbitMQ_tutorial_3/report/emit_log_2.png) ## Самостоятельная работа ### Предметная область 1. Выдача завтрака 2. Выдача обеда 3. Выдача ужина 4. Выдача меню ### Компоненты 1. **Издатель** (`publisher.py`): Генерирует случайные сообщения о заказах. 2. **Потребитель 1** (`consumer_1.py`): Обрабатывает сообщения медленно (3 секунды на сообщение). 3. **Потребитель 2** (`consumer_2.py`): Обрабатывает сообщения быстро (мгновенно). 4. **RabbitMQ**: Выступает в роли брокера сообщений. ### Описание DockerFile `Dockerfile` определяет, как будет строиться образ для контейнера, в котором будут запускаться ваши Python-скрипты. Вот основные шаги, которые выполняет `Dockerfile`: 1. **Базовый образ**: ```dockerfile FROM python:3.9-slim ``` Используется легковесный образ Python 3.9, который минимизирует размер конечного образа. 2. **Установка зависимостей**: ```dockerfile RUN pip install pika ``` Устанавливается библиотека `pika`, необходимая для работы с RabbitMQ. 3. **Копирование файлов**: ```dockerfile WORKDIR /app COPY . /app ``` Устанавливается рабочая директория `/app`, и все файлы из текущей директории копируются в контейнер. 4. **Команда по умолчанию**: ```dockerfile CMD ["python", "publisher.py"] ``` Указывается команда, которая будет выполняться при запуске контейнера. Таким образом, `Dockerfile` описывает, как создать контейнер с необходимой средой выполнения и зависимостями для приложения. ## Описание Docker Compose `docker-compose.yml` используется для определения и управления многими контейнерами в проекте. В этом файле описаны необходимые сервисы для работы системы обмена сообщениями на RabbitMQ. Основные компоненты: 1. **RabbitMQ**: ```yaml rabbitmq: image: rabbitmq:3-management container_name: rabbitmq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest healthcheck: test: ["CMD", "rabbitmqctl", "status"] interval: 10s timeout: 5s retries: 5 ``` Этот сервис запускает RabbitMQ с интерфейсом управления, доступным по портам 5672 и 15672. 2. **Publisher**: ```yaml publisher: build: context: . container_name: publisher environment: - PYTHONUNBUFFERED=1 command: python publisher.py depends_on: rabbitmq: condition: service_healthy ``` Издатель, который запускает `publisher.py` для отправки сообщений. Он зависит от RabbitMQ и запускается только после его готовности. 3. **Consumer 1**: ```yaml consumer_1: build: context: . container_name: consumer_1 environment: - PYTHONUNBUFFERED=1 command: python consumer_1.py depends_on: rabbitmq: condition: service_healthy ``` Первый потребитель, обрабатывающий сообщения медленно. Он также зависит от RabbitMQ. 4. **Consumer 2**: ```yaml consumer_2: build: context: . container_name: consumer_2 environment: - PYTHONUNBUFFERED=1 command: python consumer_2.py depends_on: rabbitmq: condition: service_healthy ``` Второй потребитель, который обрабатывает сообщения быстро. Он, как и другие сервисы, зависит от RabbitMQ. ### Запуск проекта Чтобы запустить проект, нужна следующую команду в терминале: ```bash docker-compose up ``` ### Анализ результатов ##### Работа медленного потребителя ![receive_logs_1.png](RabbitMQ_demoapp/report/slow.png) ##### Работа быстрого потребителя ![emit_log_1.png](RabbitMQ_demoapp/report/fast.png) ### Анализ очередей RabbitMQ На представленных скриншотах RabbitMQ отображается состояние двух очередей: `lunch_queue_fast` и `lunch_queue_slow`. Рассмотрим, что можно сказать по каждому из них. ### Анализ очереди `lunch_queue_fast` - **Сообщения в очереди**: Очередь пуста, сообщений в обработке нет. Графики не показывают значительных изменений, и все метрики по сообщениям равны нулю. - **Скорость обработки**: Сообщения публикуются со скоростью 1 сообщение в секунду, и одно сообщение в секунду подтверждается клиентом (Consumer ack). - **Потребители**: В этой очереди подключён один потребитель, который обрабатывает сообщения с максимальной скоростью публикации. ### Анализ очереди `lunch_queue_slow` - **Сообщения в очереди**: В этой очереди находятся необработанные сообщения. В данный момент 28 сообщений «зависли» в статусе **Unacked** (неподтвержденные). - **Скорость обработки**: Сообщения публикуются со скоростью 1 сообщение в секунду, однако подтверждение клиентом идёт со скоростью 0.4 сообщения в секунду. Это приводит к накоплению сообщений в очереди, так как потребитель не успевает их обрабатывать. - **Потребители**: Как и в `lunch_queue_fast`, здесь подключён один потребитель, но его производительность значительно ниже, что и приводит к накоплению сообщений. ### Основные выводы - **Разница в скорости обработки**: Очевидно, что `lunch_queue_slow` работает медленнее, и её потребитель не успевает обрабатывать поступающие сообщения. ## Часть 3: Ссылка на видео [Видео-отчёт Кашин Максим ПИбд-42](https://disk.yandex.ru/i/IcVxUh4C1rnQAw)