distributed-computing/tasks/nikiforova-ts/Lab_4/README.md
2023-12-18 17:52:08 +04:00

152 lines
5.4 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 Никифорова Татьяна Сергеевна.
## Установка брокера сообщений RabbitMQ
Установлен RabbitMQ. Выполнен вход на http://localhost:15672/ в качестве гостя:
![](picture/1.png)
![](picture/3.png)
## Прохождение tutorial
Tutorial№1
![](picture/5.png)
![](picture/4.png)
Tutorial№2
![](picture/6.png)
![](picture/7.png)
![](picture/8.png)
Tutorial№3
![](picture/9.png)
![](picture/10.png)
## Разработка демонстрационных приложений
Предметная область - процесс подачи заявок на работу и отбор кандидатов. Заявитель является производителем, а команды HR и система обработки заявок - потребителями.
1. Publisher:
```
using System;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
var фабрика = new ConnectionFactory { HostName = "localhost" };
using var подключение = фабрика.CreateConnection();
using var канал = подключение.CreateModel();
Random rand = new Random();
string имяОчередиОтклоненных = $"отклоненные{rand.Next()}";
канал.QueueDeclare(queue: имяОчередиОтклоненных);
канал.QueueBind(queue: имяОчередиОтклоненных,
exchange: "job",
routingKey: string.Empty);
Console.WriteLine(" [*] Ожидание сообщений.");
var потребитель = new EventingBasicConsumer(канал);
потребитель.Received += async (model, ea) =>
{
byte[] тело = ea.Body.ToArray();
var сообщение = Encoding.UTF8.GetString(тело);
int времяОжидания = rand.Next(20, 90);
Thread.Sleep(времяОжидания * 100);
string вывод = $"Заявка отложена {сообщение} на {времяОжидания} минут";
Console.WriteLine($" [x] Готово. {вывод}");
канал.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
канал.BasicConsume(queue: имяОчередиОтклоненных,
autoAck: false,
consumer: потребитель);
Console.WriteLine(" Нажмите [Enter] для выхода.");
Console.ReadLine();
```
2. Consumer 1:
```
using System.Text;
using RabbitMQ.Client;
var фабрика = new ConnectionFactory { HostName = "localhost" };
using var подключение = фабрика.CreateConnection();
using var канал = подключение.CreateModel();
канал.ExchangeDeclare(exchange: "job", type: ExchangeType.Fanout);
Random rand = new Random();
foreach (var элемент in Enumerable.Range(0, 1000))
{
var сообщение = rand.Next().ToString();
var тело = Encoding.UTF8.GetBytes(сообщение);
канал.BasicPublish(exchange: "job",
routingKey: string.Empty,
basicProperties: null,
body: тело);
Console.WriteLine($" [x] Поступила заявка {сообщение}");
await Task.Delay(500);
}
Console.WriteLine(" Нажмите [Enter] для выхода.");
Console.ReadLine();
static string ПолучитьСообщение(string[] аргументы)
{
return ((аргументы.Length > 0) ? string.Join(" ", аргументы) : "info: Принято!");
}
```
3. Consumer 3:
```
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var фабрика = new ConnectionFactory { HostName = "localhost" };
using var подключение = фабрика.CreateConnection();
using var канал = подключение.CreateModel();
канал.QueueDeclare(queue: "принятые");
канал.QueueBind(queue: "принятые",
exchange: "job",
routingKey: string.Empty);
Console.WriteLine(" [*] Ожидание сообщений.");
var потребительПринятых = new EventingBasicConsumer(канал);
потребительПринятых.Received += async (model, ea) =>
{
byte[] тело = ea.Body.ToArray();
var сообщение = Encoding.UTF8.GetString(тело);
string вывод = $"Заявка принята {сообщение} на исполнение";
Console.WriteLine($" [x] Готово. {вывод}");
канал.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
канал.BasicConsume(queue: "принятые",
autoAck: false,
consumer: потребительПринятых);
Console.WriteLine(" Нажмите [Enter] для выхода.");
Console.ReadLine();
```
## Результаты выполнения работ
Запуск программы :
![](picture/12.png)
![](picture/13.png)
![](picture/14.png)
Результаты обработки:
![](picture/11.png)
![](picture/15.png)
Вывод: Ситуация с выполнением задач в очереди первого потребителя (Consumer#1) не изменилась, однако экземпляры второго потребителя (Consumer#2) теперь требуют в два раза больше времени и ресурсов, а их очереди по-прежнему перегружены.