# Кашин Максим ПИбд-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)