النظر في مخطط تصميم خط أنابيب رسالة RabbitMQ الكلاسيكية التي تتكون من عناصر المنتج ، وتبادل ، وقائمة الانتظار ، والمستهلك.

تتمثل المهمة في تنظيم مراقبة ما يحدث في قائمة الانتظار وعدم التأثير على البرنامج الرئيسي (البرنامج) ، وإضافة القدرة المرنة على إنشاء التقارير وتجنب التكاليف الإضافية في الوقت نفسه. يجب أن يسمح لك التصميم النهائي ببناء تقارير بسرعة لتحليل تدفق البيانات على خط الأنابيب دون استخدام قدرات الخادم الرئيسية (والتي ستتجنب التحميل الإضافي) والبرنامج الرئيسي. يجب أن يكون النهج محمولة بسهولة على بنية أكثر تعقيدًا.
بادئ ذي بدء ، سننظم منصة عرض ، لهذا سنقوم بإجراء التغييرات التالية على تشغيل الناقل:

في البداية ، تم تعيين التكوين التالي لـ Exchange (faust) ، والذي لا يتغير في المثال المعتبر أثناء التعديل:

أحد الإعدادات المهمة هو نوع fanaut - الذي يسمح لك بإنشاء قائمتين نظير إلى نظير وتكرار تدفق الرسالة بالكامل في قائمة انتظار الإحصائيات الجديدة:


دون أي تدخل في العملية الرئيسية في قائمة انتظار السجلات. لنبدأ بمعالجة تدفق الرسائل. بادئ ذي بدء ، نقوم بإنشاء جدول على خادم MS SQL لتخزين المعلومات الإحصائية. يمكنك استخدام أي طريقة أخرى ، على سبيل المثال ، حفظ الرسائل في ملف بتنسيق xml أو بأي طريقة أخرى ، في هذا المثال ، يتم تحديد خادم SQL لتجنب البرمجة الإضافية
create table RabbitMsg( id int PRIMARY KEY IDENTITY(1000,1), [Message] nvarchar(1000) DEFAULT '', RegDate datetime default GETDATE())
كما ترى من استعلام SQL ، هذا جدول يحتوي على رقم سجل وبعض النص والتاريخ الذي تم فيه إدراج السجل في الجدول.
لنقم بإنشاء عميل سيتصل بـ 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

إنشاء تقرير يستند إلى قائمة انتظار الإحصائيات
إليك ما حدث:

استنتاج
يوضح المثال المدروس كيفية جمع الإحصاءات بسرعة وإنشاء تقرير يمكن حفظه في PDF وإرساله بالبريد وفقًا لخط أنابيب RabbitMQ وقائمة انتظار إضافية. من السهل الخروج بأمثلة للمهام عندما يتم جمع المعلومات حول أي عمليات ويتم إنشاء التقارير دون تطوير جانب الخادم. بالنظر إلى أن FastReports تقدم نسخة مفتوحة المصدر ، فمن الممكن خفض تكاليف التطوير بشكل كبير دون أي تكلفة إضافية. يمكن إعادة تكوين الناقل نفسه بسهولة ويمكن تكييفه لمهام أكثر تعقيدًا.