8.4 KiB
Кашин Максим ПИбд-42
RabbitMQ tutorial - "Hello world!"
Работа файла receive
Работа файла send
RabbitMQ tutorial - Work Queues
Работа файла new_task
Работа файла worker
Работа файла worker (запущенная копия)
RabbitMQ tutorial - Publish/Subscribe
Работа файла receive_logs
Работа файла emit_log
Работа файла emit_log (запущенная копия)
Самостоятельная работа
Предметная область
- Выдача завтрака
- Выдача обеда
- Выдача ужина
- Выдача меню
Компоненты
- Издатель (
publisher.py
): Генерирует случайные сообщения о заказах. - Потребитель 1 (
consumer_1.py
): Обрабатывает сообщения медленно (3 секунды на сообщение). - Потребитель 2 (
consumer_2.py
): Обрабатывает сообщения быстро (мгновенно). - RabbitMQ: Выступает в роли брокера сообщений.
Описание DockerFile
Dockerfile
определяет, как будет строиться образ для контейнера, в котором будут запускаться ваши Python-скрипты. Вот основные шаги, которые выполняет Dockerfile
:
-
Базовый образ:
FROM python:3.9-slim
Используется легковесный образ Python 3.9, который минимизирует размер конечного образа.
-
Установка зависимостей:
RUN pip install pika
Устанавливается библиотека
pika
, необходимая для работы с RabbitMQ. -
Копирование файлов:
WORKDIR /app COPY . /app
Устанавливается рабочая директория
/app
, и все файлы из текущей директории копируются в контейнер. -
Команда по умолчанию:
CMD ["python", "publisher.py"]
Указывается команда, которая будет выполняться при запуске контейнера.
Таким образом, Dockerfile
описывает, как создать контейнер с необходимой средой выполнения и зависимостями для приложения.
Описание Docker Compose
docker-compose.yml
используется для определения и управления многими контейнерами в проекте. В этом файле описаны необходимые сервисы для работы системы обмена сообщениями на RabbitMQ. Основные компоненты:
-
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.
-
Publisher:
publisher: build: context: . container_name: publisher environment: - PYTHONUNBUFFERED=1 command: python publisher.py depends_on: rabbitmq: condition: service_healthy
Издатель, который запускает
publisher.py
для отправки сообщений. Он зависит от RabbitMQ и запускается только после его готовности. -
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.
-
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
Анализ результатов
Работа медленного потребителя
Работа быстрого потребителя
Анализ очередей 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
работает медленнее, и её потребитель не успевает обрабатывать поступающие сообщения.