172 lines
8.4 KiB
Markdown
172 lines
8.4 KiB
Markdown
|
# Кашин Максим ПИбд-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 (запущенная копия)
|
|||
|

|
|||
|
|
|||
|
## Самостоятельная работа
|
|||
|
### Предметная область
|
|||
|
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
|
|||
|
```
|
|||
|
### Анализ результатов
|
|||
|
##### Работа медленного потребителя
|
|||
|

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

|
|||
|
|
|||
|
### Анализ очередей 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)
|