distributed-computing/tasks/kazakov-ev/lab_4/README.md
2023-12-18 12:22:22 +03:00

151 lines
4.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.

# Отчет по лабораторной работе №4
Выполнил студент гр. ИСЭбд-41 Казаков Е.В.
## Прохождение tutorial
Установил rabbitMQ server, erlang и зашел в брокер под гостем по http://localhost:15672/#/
Туториал 1:
![](pic/1.png)
![](pic/1.1.png)
Туториал 2:
![](pic/2.png)
![](pic/2.1.png)
![](pic/2.2.png)
Туториал 3:
![](pic/3.png)
![](pic/3.1.png)
## Разработка демонстрационных приложений
Предметная область: Доставка почты. Производитель - почтовая станция, которая сигнализирует о том, что пришла почта. Потребитель 1 - курьер тратит время и доставляет почту. Потребитель 2 - мы отправляет письмо по почте.
1. Publisher
```py
using System.Text;
using RabbitMQ.Client;
Random rand = new Random();
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "post", type: ExchangeType.Fanout);
foreach (var item in Enumerable.Range(0, 1000))
{
var message = rand.Next().ToString();
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "post",
routingKey: string.Empty,
basicProperties: null,
body: body);
Console.WriteLine($" [x] Письмо готово {message}");
await Task.Delay(500);
}
Console.WriteLine(" Нажми [enter] чтобы выйти.");
Console.ReadLine();
static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "info: Привет Мир!");
}
```
2. Consumer 1.
```py
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
Random rand = new Random();
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
string queueName = $"courier{rand.Next()}";
channel.QueueDeclare(queue: queueName);
channel.QueueBind(queue: queueName,
exchange: "post",
routingKey: string.Empty);
Console.WriteLine(" [*] Ожидание сообщения.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
int waitTime = rand.Next(20, 90);
Thread.Sleep(waitTime * 100);
string outputText = $"Курьер с письмом потратил {waitTime} минут и доставил письмо {message}";
Console.WriteLine($" [x] Сделано. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine(" Нажми [enter] чтобы выйти.");
Console.ReadLine();
```
3. Consumer 2.
```py
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "mail");
channel.QueueBind(queue: "mail",
exchange: "post",
routingKey: string.Empty);
Console.WriteLine(" [*] Ожидание сообщения.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
string outputText = $"Письмо было отправлено почтой {message}";
Console.WriteLine($" [x] Сделано. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: "mail",
autoAck: false,
consumer: consumer);
Console.WriteLine(" Нажми [enter] чтобы выйти.");
Console.ReadLine();
```
## Результаты выполнения лабораторной работы
Вот работа наших 2 потребителей и производителя
![](pic/4.1.png)
Наш график, где нагляжно видно очереди и скорость прохода сообщений
![](pic/4.png)
Очередь с названием "courier..." - это наша очередь с курьером, а очередь "mail" - почтой
![](pic/4.2.png)
Вывод: Consumer2 - меньше нагружает память(из-за отсутствия простаивания очереди) и быстрее по времени, чем Consumer1(Реально, я вот щас пишу записку, а он до сих пор назначает курьеров😂)