DAS_2023_1/basharin_sevastyan_lab_4/README.md

76 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа 3. Вариант 5.
### Как запустить
В директории с файлами выполнить следующие команды:
+ Запустить Publisher `python publisher.py`.
+ Запустить Consumer 1 `python consumer1.py`.
+ Запустить Consumer 2 `python consumer2.py`.
### Описание работы
Есть отправитель `publisher` и два слушателя `consumer1` и `consumer2`
`publisher`, согласно заданию, отправляет сообщения раз в 3 секунды.
```python
import time
import random
def publish_event(channel, exchange_name):
events = ["пришёл заказ", "сообщение от пользователя", "необходимо создать отчёт"]
while True:
event = random.choice(events)
channel.basic_publish(exchange=exchange_name, routing_key='', body=event)
print(f"Отправлено событие: {event}")
time.sleep(3) # Задержка отправки
```
`consumer1` прослушивает очередь `queue1` раз в 2 секунды.
```python
import time
def process_message(ch, method, properties, body): # Функция получения сообщений
print(f"Получено сообщение (Consumer 1): {body.decode('utf-8')}")
time.sleep(2) # Задержка прослушиваения
ch.basic_ack(delivery_tag=method.delivery_tag)
```
Созданная очередь `queue1`
![](queue1.png "")
`consumer2` прослушивает очередь без задержек.
```python
def process_message(ch, method, properties, body): # Функция получения сообщений
print(f"Получено сообщение (Consumer 2): {body.decode('utf-8')}")
ch.basic_ack(delivery_tag=method.delivery_tag)
def consume_messages(channel, queue_name, exchange_name): # Функция прослушки очереди
channel.queue_declare(queue=queue_name)
channel.queue_bind(exchange=exchange_name, queue=queue_name)
channel.basic_consume(queue=queue_name, on_message_callback=process_message)
print("Consumer 2 начал прослушивание сообщений...")
channel.start_consuming()
```
Созданная очередь `queue2`
![](queue2.png "")
Скриншот из `RabbitMQ Management UI`.
![](queues.png "")
### Анализ результатов
Сначала разберем первую ситуацию, когда запущены `consumer1` и `consumer2`.
![](PC1C2.png "")
Тогда график очереди `queue1` будет таким:
![](queue1.png "")
Если мы параллельно запустим ещё один процесс `consumer1`, то с заданными нами параметрами ситуация изменится слабо,
тк в момент обновления `RabbitMQ Management UI` в очереди будет как минимум одно сообщение, но сообщений будет получено
больше. Если уменьшить время отправки сообщений, то можно будет отследить изменения в очереди `queue1`.
Терминалы:
![](PC1C1.png "")
`RabbitMQ Management UI`:
![](queue1_c1c1.png "")
В данном эксперименте трудно установить, какой из вариантов лучше, но можно установить, что `consumer2` будет показывать
ту же эффективность, что и связка `consumer1` + `consumer1` и то, что два `consumer1` будут эффективнее разгружать очередь, чем один `consumer1`.
### Видео
https://youtu.be/GoXtPGZe9jY