# Отчет по лабораторной работе №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 раза больше времени