DAS_2024_1/kashin_maxim_lab_4/readme.md
2024-10-27 19:09:16 +04:00

8.4 KiB
Raw Permalink Blame History

Кашин Максим ПИбд-42

RabbitMQ tutorial - "Hello world!"

Работа файла receive

receive_1.png

Работа файла send

send_1.png

RabbitMQ tutorial - Work Queues

Работа файла new_task

new_task_1.png

Работа файла worker

worker_1.png

Работа файла worker (запущенная копия)

worker_2.png

RabbitMQ tutorial - Publish/Subscribe

Работа файла receive_logs

receive_logs_1.png

Работа файла emit_log

emit_log_1.png

Работа файла emit_log (запущенная копия)

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. Базовый образ:

    FROM python:3.9-slim
    

    Используется легковесный образ Python 3.9, который минимизирует размер конечного образа.

  2. Установка зависимостей:

    RUN pip install pika
    

    Устанавливается библиотека pika, необходимая для работы с RabbitMQ.

  3. Копирование файлов:

    WORKDIR /app
    COPY . /app
    

    Устанавливается рабочая директория /app, и все файлы из текущей директории копируются в контейнер.

  4. Команда по умолчанию:

    CMD ["python", "publisher.py"]
    

    Указывается команда, которая будет выполняться при запуске контейнера.

Таким образом, Dockerfile описывает, как создать контейнер с необходимой средой выполнения и зависимостями для приложения.

Описание Docker Compose

docker-compose.yml используется для определения и управления многими контейнерами в проекте. В этом файле описаны необходимые сервисы для работы системы обмена сообщениями на RabbitMQ. Основные компоненты:

  1. RabbitMQ:

    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:

    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:

    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:

    consumer_2:
      build:
        context: .
      container_name: consumer_2
      environment:
        - PYTHONUNBUFFERED=1
      command: python consumer_2.py
      depends_on:
        rabbitmq:
          condition: service_healthy
    

    Второй потребитель, который обрабатывает сообщения быстро. Он, как и другие сервисы, зависит от RabbitMQ.

Запуск проекта

Чтобы запустить проект, нужна следующую команду в терминале:

docker-compose up

Анализ результатов

Работа медленного потребителя

receive_logs_1.png

Работа быстрого потребителя

emit_log_1.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