yakovleva_yulia_lab_4 is ready
43
yakovleva_yulia_lab_4/Consumer1.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import pika
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
queue_name = 'queue1'
|
||||||
|
exchange = 'logs'
|
||||||
|
|
||||||
|
def callback(ch, method, properties, body):
|
||||||
|
received_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
message = body.decode()
|
||||||
|
|
||||||
|
print(f"[{received_time}] Потребитель 1: сообщение - '{message}'")
|
||||||
|
|
||||||
|
# Имитация обработки сообщения
|
||||||
|
time.sleep(random.choice([1, 2]))
|
||||||
|
|
||||||
|
print(f"[{received_time}] Потребитель 1: сообщение '{message}' обработано\n")
|
||||||
|
|
||||||
|
ch.basic_ack(delivery_tag=method.delivery_tag)
|
||||||
|
|
||||||
|
def setup_connection():
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.queue_declare(queue=queue_name)
|
||||||
|
|
||||||
|
channel.queue_bind(exchange=exchange, queue=queue_name)
|
||||||
|
|
||||||
|
return connection, channel
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
connection, channel = setup_connection()
|
||||||
|
try:
|
||||||
|
print("[*] Ожидание сообщений")
|
||||||
|
channel.basic_consume(queue=queue_name, on_message_callback=callback)
|
||||||
|
channel.start_consuming()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("Остановка...")
|
||||||
|
finally:
|
||||||
|
if connection.is_open:
|
||||||
|
connection.close()
|
||||||
|
print("Соединение закрыто.")
|
36
yakovleva_yulia_lab_4/Consumer2.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import pika
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
queue_name = 'queue2'
|
||||||
|
exchange = 'logs'
|
||||||
|
|
||||||
|
def callback(ch, method, properties, body):
|
||||||
|
received_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
message = body.decode()
|
||||||
|
print(f"[{received_time}] Потребитель 2: пришло сообщение '{message}'")
|
||||||
|
print(f"[{received_time}] Потребитель 2: сообщение '{message}' обработано\n")
|
||||||
|
|
||||||
|
ch.basic_ack(delivery_tag=method.delivery_tag)
|
||||||
|
|
||||||
|
def setup_connection():
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.queue_declare(queue=queue_name)
|
||||||
|
|
||||||
|
channel.queue_bind(exchange=exchange, queue=queue_name)
|
||||||
|
|
||||||
|
return connection, channel
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
connection, channel = setup_connection()
|
||||||
|
try:
|
||||||
|
print("[*] Ожидание сообщений")
|
||||||
|
channel.basic_consume(queue=queue_name, on_message_callback=callback)
|
||||||
|
channel.start_consuming()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("Остановка...")
|
||||||
|
finally:
|
||||||
|
if connection.is_open:
|
||||||
|
connection.close()
|
||||||
|
print("Соединение закрыто.")
|
22
yakovleva_yulia_lab_4/Publisher.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import pika
|
||||||
|
import time
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
channel.exchange_declare(exchange='logs', exchange_type='fanout')
|
||||||
|
|
||||||
|
messages = [
|
||||||
|
"Приехал товар",
|
||||||
|
"Клиент забронировал компьютер",
|
||||||
|
"Необходимо создать отчет за день"
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
for message in messages:
|
||||||
|
channel.basic_publish(exchange='logs', routing_key='', body=message)
|
||||||
|
print(f"Отправлено сообщение: {message}")
|
||||||
|
time.sleep(1) # Задержка между сообщениями
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
connection.close()
|
33
yakovleva_yulia_lab_4/README.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Лабораторная работа №4 - Работа с брокером сообщений
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
Был установлен брокер сообщений RabbitMQ и выполнены 3 задачи туториала. Было разработано демонстрационное приложение работы с брокером сообщений RabbitMQ по предметной области "Управление компьютерным клубом"
|
||||||
|
|
||||||
|
## Прохождение tutorials:
|
||||||
|
|
||||||
|
tutorial 1
|
||||||
|
![результат работы](./images/image1.png)
|
||||||
|
|
||||||
|
tutorial 2
|
||||||
|
![результат работы](./images/image2.png)
|
||||||
|
|
||||||
|
tutorial 3
|
||||||
|
![результат работы](./images/image3.png)
|
||||||
|
![результат работы](./images/image4.png)
|
||||||
|
|
||||||
|
|
||||||
|
## Демонстрация работы:
|
||||||
|
|
||||||
|
#### При одном запущенном Consumer1
|
||||||
|
![результат работы](./images/image5.png)
|
||||||
|
#### При двух запущенном Consumer1
|
||||||
|
![изображение 2](./images/image6.png)
|
||||||
|
#### При трёх запущенном Consumer1
|
||||||
|
![изображение 3](./images/image7.png)
|
||||||
|
#### Очередь 2
|
||||||
|
![изображение 4](./images/image8.png)
|
||||||
|
|
||||||
|
Здесь мы видим, что чем больше запущено обработчиков сообщений, тем меньше они задерживаются в очереди. Также здесь видно, что очередь 2 всегда свободна, так как Consumer2 работает без задержек и сразу обрабатывает сообщения, в отличие от Consumer1, где установлена задержка.
|
||||||
|
|
||||||
|
## Отчет
|
||||||
|
Работоспособность: [Видео](https://drive.google.com/file/d/175HC9tEV-s5rglFFp4Z4j7MTteocKYrZ/view?usp=sharing)
|
BIN
yakovleva_yulia_lab_4/images/image1.jpg
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
yakovleva_yulia_lab_4/images/image2.jpg
Normal file
After Width: | Height: | Size: 183 KiB |
BIN
yakovleva_yulia_lab_4/images/image3.jpg
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
yakovleva_yulia_lab_4/images/image4.jpg
Normal file
After Width: | Height: | Size: 130 KiB |
BIN
yakovleva_yulia_lab_4/images/image5.jpg
Normal file
After Width: | Height: | Size: 173 KiB |
BIN
yakovleva_yulia_lab_4/images/image6.jpg
Normal file
After Width: | Height: | Size: 177 KiB |
BIN
yakovleva_yulia_lab_4/images/image7.jpg
Normal file
After Width: | Height: | Size: 177 KiB |
BIN
yakovleva_yulia_lab_4/images/image8.jpg
Normal file
After Width: | Height: | Size: 163 KiB |