distributed-computing/tasks/nikiforova-ts/Lab_4
2023-12-18 17:52:08 +04:00
..
DApp Lab_4 2023-12-18 17:52:08 +04:00
picture Lab_4 2023-12-18 17:52:08 +04:00
Tutorial№1 Lab_4 2023-12-18 17:52:08 +04:00
Tutorial№2 Lab_4 2023-12-18 17:52:08 +04:00
Tutorial№3 Lab_4 2023-12-18 17:52:08 +04:00
.gitignore Lab_4 2023-12-18 17:52:08 +04:00
README.md Lab_4 2023-12-18 17:52:08 +04:00

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

Выполнила: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.

Установка брокера сообщений RabbitMQ

Установлен RabbitMQ. Выполнен вход на http://localhost:15672/ в качестве гостя:

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

Tutorial№1

Tutorial№2

Tutorial№3

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

Предметная область - процесс подачи заявок на работу и отбор кандидатов. Заявитель является производителем, а команды 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();
  1. 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: Принято!");
}
  1. 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();

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

Запуск программы :

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

Вывод: Ситуация с выполнением задач в очереди первого потребителя (Consumer#1) не изменилась, однако экземпляры второго потребителя (Consumer#2) теперь требуют в два раза больше времени и ресурсов, а их очереди по-прежнему перегружены.