# Отчёт по лабораторной работе №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) теперь требуют в два раза больше времени и ресурсов, а их очереди по-прежнему перегружены.