# Отчет по лабораторной работе №4

Выполнил студент гр. ИСЭбд-41 Мельников К.Ю.

## Прохождение tutorial

Установил rabbitMQ server, erlang и зашел в брокер под гостем по http://localhost:15672/#/ 

Туториал 1:

![](scrins/tut1.png)
![](scrins/send.png)
![](scrins/receive.png)
Туториал 2:

![](scrins/tut2.png)
![](scrins/newtask.png)
![](scrins/worker.png)

Туториал 3:

![](scrins/tut3.png)
![](scrins/emitlog.png)
![](scrins/receivelogs.png)

## Разработка демонстрационных приложений

Предметная область: Дополенительные соглашения и договора на заселение в отель Туристического агентства.
Разработа три приложения согласно предметной области.

1. Publisher

```py
import pika
import time
import random

collection = ["Application for Travel Agency", "Buying tickets", "Execution of the agreement", "Check-into a hotel"]

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='Agreements', exchange_type='fanout')

while True:
    message = f"Message: {random.choice(collection)}"

    channel.basic_publish(exchange='Agreements', routing_key='', body=message)

    time.sleep(1)

connection.close()
```

2. Consumer 1.

```py
import pika
import time

def process_message(ch, method, properties, body):
    print(f"Получено сообщение: {body}")
    time.sleep(3)
    print("Сообщение успешно обработано")

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue

channel.queue_bind(exchange='Agreements', queue=queue_name)

channel.basic_consume(queue=queue_name, on_message_callback=process_message, auto_ack=True)

print('Ожидание сообщений...')
channel.start_consuming()
```

3. Consumer 2.

```py
import pika


def process_message(ch, method, properties, body):
    print(f"Получено сообщение: {body}")
    print("Сообщение успешно обработано")

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue

channel.queue_bind(exchange='Agreements', queue=queue_name)

channel.basic_consume(queue=queue_name, on_message_callback=process_message, auto_ack=True)

print('Ожидание сообщений...')
channel.start_consuming()
```

## Результаты выполнения лабораторной работы

Результат отработки Consumer_1:

![](scrins/maintask1.png)

Результат отработки Consumer_2:

![](scrins/maintask2.png)

![](scrins/maintask_dop.png)

Вывод: Consumer_2 нагружает меньше памяти, чем Consumer_1 и принимает сообщения гораздо быстрее, тем самым не позволяя очереди накапливать огромное количество сообщений.