监视RabbitMQ中的消息

考虑由生产者,交换,队列和消费者元素组成的经典RabbitMQ消息管道设计方案。



任务是组织对队列中正在发生的事情的监视,并且不影响主软件(软件),增加创建报告的灵活功能,同时避免额外的费用。 最终设计应允许您快速构建报告,以分析管道上的数据流,而无需使用主服务器容量(这将避免额外的负载)和主软件。 该方法应易于移植到更复杂的体系结构中。

首先,我们将组织一个展示台,为此,我们将对传送带的操作进行以下更改:



最初,为Exchange(浮士德)设置了以下配置,在修改的示例中,该配置不会更改:



一个重要的设置是fanaut类型-它允许您创建两个对等队列,并将整个消息流复制到新的Statistics队列中:





不会干扰“日志”队列中的主进程。 让我们开始处理消息流。 首先,我们在MS SQL服务器上创建一个表来存储统计信息。 您可以使用任何其他方法,例如,将消息以xml格式或任何其他方式保存到文件中,在此示例中,选择SQL Server是为了避免进行其他编程

create table RabbitMsg( id int PRIMARY KEY IDENTITY(1000,1), [Message] nvarchar(1000) DEFAULT '', RegDate datetime default GETDATE()) 

从SQL查询中可以看到,这是一个表,其中包含记录号,一些文本和记录插入到表中的日期。

让我们创建一个客户端,该客户端将与Statistics队列中的RabbitMQ联系,收集接收到的数据并将其传输到RabbitMsg表

 using System; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Data.SqlClient; namespace Getter { class Program { static void Main(string[] args) { var factory = new ConnectionFactory() { HostName = "192.168.1.241", Port = 30672, UserName = "robotics01", Password = "" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange: "faust", type: "fanout", durable: true); var queueName = "Statistics"; channel.QueueBind(queue: queueName, exchange: "faust", routingKey: ""); Console.WriteLine(" [*] Waiting for logs."); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] {0}", message); SqlConnection sqlconnection = new SqlConnection("Server=tcp:fastreportsql,1433;Initial Catalog=FastReportSQL;Persist Security Info=False;User ID=ufocombat;Password=;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"); sqlconnection.Open(); SqlCommand cmd = new SqlCommand($"INSERT INTO RabbitMsg(Message) VALUES (@msg)", sqlconnection); cmd.Parameters.AddWithValue("msg", message); cmd.ExecuteNonQuery(); sqlconnection.Close(); }; channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } Console.WriteLine("Hello World!"); } } } 

让我们看看它是如何实时工作的。


同时,在MS SQL Server上



根据统计信息队列生成报告


这是发生了什么:



结论


所考虑的示例显示了如何快速收集统计信息,甚至构建根据RabbitMQ管道和附加队列可以保存为PDF并通过邮件发送的报告。 在不开发服务器端的情况下收集有关任何流程的信息并生成报告时,很容易想到任务示例。 鉴于FastReports提供了开放源代码版本,因此可以在不增加成本的情况下大大降低开发成本。 输送机本身也很容易重新配置,可以适应更复杂的任务。

Source: https://habr.com/ru/post/zh-CN447412/


All Articles