distributed-computing/tasks/savitskiy-al/lab_4/README.md
2023-12-15 14:24:54 +04:00

159 lines
5.7 KiB
Markdown
Raw Permalink 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/tut1.png)
Туториал 2:
![](pic/tut2.png)
Туториал 3:
![](pic/tut3.png)
## Разработка демонстрационных приложений
Предметная область: Обработка изделий. Производитель - поставщик изделий, который сигнализирует о том, что изделие готово к обработке. Потребитель 1 - специалист, который вручную обрабатывает изделие и тратит время. Потребитель 2 - автоматическая обработка станком, считается что станок обрабатывает изделие моментально и не тратит время.
1. Publisher
```cs
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: "boardProcessing", 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: "boardProcessing",
routingKey: string.Empty,
basicProperties: null,
body: body);
Console.WriteLine($" [x] Готов заказ {message}");
await Task.Delay(500);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "info: Hello World!");
}
```
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();
channel.QueueDeclare(queue: "automatic");
channel.QueueBind(queue: "automatic",
exchange: "boardProcessing",
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);
string outputText = $"Станок моментально обработал изделие {message}";
Console.WriteLine($" [x] Done. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: "automatic",
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;
Random rand = new Random();
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
string queueName = $"manual{rand.Next()}";
channel.QueueDeclare(queue: queueName);
channel.QueueBind(queue: queueName,
exchange: "boardProcessing",
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);
int waitTime = rand.Next(20, 90);
Thread.Sleep(waitTime * 100);
string outputText = $"Ручная обработка изделия {message} заняла {waitTime}";
Console.WriteLine($" [x] Done. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
```
## Результаты выполнения лабораторной работы
Потребителю один соответствует очередь automatic, а потребителю два - очередь manual.
Запуск двух экземпляров потребителя два и по одному экземпляру потребителя один и заказчика:
![](pic/1.PNG)
Очередь ручной обработки.
![](pic/2.PNG)
Очередь автоматической обработки
![](pic/3.PNG)
Как видно, первый потребитель работает без задержки, а очередь второго потребителя переполенена. Из этого следует, что скорость первого в разы выше, и он потребляет намного меньше памяти за счет постоянно пустой очереди.
Теперь добавим еще одного потребителя с ручной обработкой
![](pic/4.PNG)
Очередь ручной обработки.
![](pic/6.PNG)
Очередь автоматической обработки
![](pic/7.PNG)
Ситуация в очередью потребителя один не изменилась, а экземпляры потребителя два теперь затрачивают в 2 раза больше времени и памяти, их очереди так же переполнены, как и в ситуации выше.