Considere o esquema clássico de design do pipeline de mensagens RabbitMQ, composto por elementos Producer, Exchange, Queue e Consumer.

A tarefa é organizar o monitoramento do que está acontecendo na fila e não afetar o software principal (software), adicionar a capacidade flexível de criar relatórios e, ao mesmo tempo, evitar custos adicionais. O design final deve permitir a criação rápida de relatórios para analisar o fluxo de dados no pipeline sem usar as capacidades principais do servidor (o que evitará carga adicional) e o software principal. A abordagem deve ser facilmente transportável para uma arquitetura mais complexa.
Antes de tudo, organizaremos um estande de demonstração, para isso faremos as seguintes alterações na operação do transportador:

Inicialmente, a seguinte configuração foi definida para o Exchange (faust), que não muda no exemplo considerado durante a modificação:

Uma configuração importante é o tipo fanaut - que permite criar duas filas ponto a ponto e duplicar todo o fluxo de mensagens na nova fila Estatísticas:


sem qualquer interferência com o processo principal na fila Logs. Vamos começar a processar o fluxo de mensagens. Primeiro, criamos uma tabela no servidor MS SQL para armazenar informações estatísticas. Você pode usar qualquer outra abordagem, por exemplo, salvar mensagens em um arquivo no formato xml ou de qualquer outra forma; neste exemplo, o servidor SQL é selecionado para evitar programação adicional
create table RabbitMsg( id int PRIMARY KEY IDENTITY(1000,1), [Message] nvarchar(1000) DEFAULT '', RegDate datetime default GETDATE())
Como você pode ver na consulta SQL, esta é uma tabela com um número de registro, algum texto e a data em que o registro foi inserido na tabela.
Vamos criar um cliente que entrará em contato com RabbitMQ na fila de Estatísticas, colete os dados recebidos e os transfira para a tabela 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!"); } } }
Vamos ver como isso funciona em tempo real.
Enquanto isso, no MS SQL Server

Crie um relatório com base na fila Estatísticas
Aqui está o que aconteceu:

Conclusão
O exemplo considerado mostra como coletar estatísticas rapidamente e até criar um relatório que pode ser salvo em PDF e enviado por correio, de acordo com o pipeline do RabbitMQ e uma fila adicional. É fácil criar exemplos de tarefas quando as informações são coletadas sobre quaisquer processos e os relatórios são criados sem o desenvolvimento do lado do servidor. Dado que o FastReports oferece uma versão de código aberto, é possível reduzir significativamente os custos de desenvolvimento sem nenhum custo adicional. O transportador em si também é facilmente reconfigurável e pode ser adaptado para tarefas mais complexas.