distributed-computing/tasks/mutriskov-ds/lab_4/README.md

149 lines
4.6 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:
![](images/tut1.png)
Туториал 2:
![](images/tut2.png)
Туториал 3:
![](images/tut3.png)
## Разработка демонстрационных приложений
Предметная область: Офис. Производитель - начальник, который посылает задачу на составление отчета, Потребители - работники офиса.
1. Publisher
```cs
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "reports", type: ExchangeType.Fanout);
Random rand = new Random();
foreach (var item in Enumerable.Range(0, 1000))
{
var message = $"Необходимо создать отчет #{rand.Next()}";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "reports",
routingKey: string.Empty,
basicProperties: null,
body: body);
Console.WriteLine($" [x] Поступила работа {message}");
await Task.Delay(1000);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
```
2. Consumer 1.
```cs
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();
Random rand = new Random();
string queueName = $"queue1";
channel.QueueDeclare(queue: queueName);
channel.QueueBind(queue: queueName,
exchange: "reports",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var reportNumber = message.Split('#')[1];
Console.WriteLine($" [x] Отчет #{reportNumber} создан.");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
```
3. Consumer 2.
```cs
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();
Random rand = new Random();
string queueName = $"queue{rand.Next()}";
channel.QueueDeclare(queue: queueName);
channel.QueueBind(queue: queueName,
exchange: "reports",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var reportNumber = message.Split('#')[1];
Thread.Sleep(2500);
Console.WriteLine($" [x] Отчет #{reportNumber} создан.");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
```
## Результаты выполнения лабораторной работы
Выполнение с одним потребителем с задержкой в выполении работы.
![](images/c1-1.png)
Очередь с работником без задержки в выполенении работы обрабатывается моментально и несет минимальную нагрузку.
Очередь работника с задержкой в выполении работы довольно быстро загружается.
Пример с двумя потребителями с задержкой в выполении работы
![](images/c1-2.png)
Очередь с работником без задержки в выполенении работы не изменилась.
На очереди работников с задержкой в выполении работы закономерно тратится в 2 раза больше времени