مساء الخير يا حبر! أريد أن أشارك كتابًا مرجعيًا للكتب المدرسية للمعرفة تمكنت من جمعه RabbitMQ واختصارها في توصيات واستنتاجات قصيرة.
جدول المحتويات
الأرنب الجزء 1. مقدمة. Erlang و AMQP و RPC
الأرنب الجزء 2. فهم التبادلات
الأرنب الجزء 3. فهم قوائم الانتظار والارتباطات
الأرنب الجزء 4. فهم ما هي الرسائل والأطر
الأرنب الجزء 5: نشر واستهلاك أداء الرسائل
الأرنب الجزء 6. نظرة عامة على وحدات الاتحاد والمجرفة
الأرنب الجزء 7. تفاصيل حول الاتصال وشانيل
الأرنب الجزء 8. RabbitMQ في .NET
الأرنب الجزء 9. الرصد
باختصار حول AMQP
AMQP (بروتوكول وضع الرسائل في قائمة انتظار المتقدم) هو بروتوكول مفتوح لتمرير الرسائل بين مكونات النظام. الفكرة الرئيسية هي أن الأنظمة الفرعية الفردية (أو التطبيقات المستقلة) يمكنها تبادل الرسائل بشكل تعسفي من خلال وسيط AMQP الذي يقوم بالتوجيه ، وربما يضمن التسليم ، وتوزيع تدفقات البيانات ، والاشتراك في أنواع الرسائل المطلوبة.
بروتوكول AMQP يقدم ثلاثة مفاهيم:
exchange (تبادل أو تبادل) - يتم إرسال الرسائل إليها. نقطة الصرف يوزع الرسالة في قائمة انتظار واحدة أو أكثر. هي يوجه الرسائل إلى قائمة انتظار بناءً على الروابط التي تم إنشاؤها (binding) بينها وبين قائمة الانتظار
queue (قائمة الانتظار) - بنية بيانات على القرص أو في ذاكرة الوصول العشوائي ، والتي يخزن روابط للرسائل ويعطي نسخًا من الرسائل consumers (للمستهلكين)
binding (ملزم) - قاعدة أن تخبر نقطة التبادل في أي من قوائم الانتظار التي يجب أن تقع هذه الرسائل فيها
Erlang التي طورتها الشركة Ericsson في منتصف الثمانينيات كنظام موزّع ومتحمل للأخطاء وفي الوقت الفعلي للتطبيقات التي تتطلب وقت تشغيل بنسبة 1980٪. Erlang تستخدم في مختلف الصناعات والتطبيقات الحديثة ، على سبيل المثال في WhatsApp. يمكنك قراءة المزيد في المقال هندسة WhatsApp ، التي اشتراها Facebook مقابل 19 مليار دولار
باختصار عن RabbitMQ
RabbitMQ هو وسيط رسائل مفتوح المصدر. يقوم بتوجيه الرسائل وفقًا لجميع المبادئ الأساسية للبروتوكول AMQP موضح في مواصفة. RabbitMQ تنفذ وتكمل البروتوكول AMQP.
الفكرة الأساسية لنموذج المراسلة في RabbitMQ الشيء هو producer (الناشر) لا يرسل الرسائل مباشرة إلى قائمة الانتظار. في الواقع ، وفي كثير من الأحيان ، لا يعرف الناشر ما إذا كان سيتم تسليم الرسالة إلى أي قائمة انتظار على الإطلاق.
بدلاً من ذلك ، يمكن للناشر إرسال الرسائل فقط إلى التبادل. من ناحية ، يتلقى التبادل رسائل من الناشرين ، ومن ناحية أخرى ، يرسلها إلى قوائم الانتظار. يجب أن يعرف التبادل بالضبط ما يجب فعله بالرسالة المستلمة. هل يجب إضافته إلى قائمة انتظار معينة؟ هل يجب إضافته إلى قوائم انتظار متعددة؟ أو يجب تجاهل الرسالة.
العمل لفترة وجيزة RabbitMQ يمكن وصفها على النحو التالي:
الناشر يرسل رسالة إلى تبادل معين
التبادل ، بعد تلقي رسالة ، يوجهها إلى قائمة انتظار واحدة أو أكثر وفقًا للقواعد الملزمة بينها وبين قائمة الانتظار
قائمة الانتظار تخزن ارتباط لهذه الرسالة. يتم تخزين الرسالة نفسها في ذاكرة الوصول العشوائي أو على القرص
بمجرد أن يكون المستهلك جاهزًا لتلقي رسالة من قائمة الانتظار ، يقوم الخادم بإنشاء نسخة من الرسالة بالإشارة وإرسالها
يتلقى المستهلك الرسالة ويرسل إقرارًا إلى الوسيط
يقوم الوسيط ، بعد استلام التأكيد ، بإزالة نسخة من الرسالة من قائمة الانتظار. ثم يحذف من ذاكرة الوصول العشوائي ومن القرص
RPC
عملية RPC (استدعاء إجراء عن بعد) يكمن وراء جميع التفاعلات تقريبًا مع النواة RabbitMQ. على سبيل المثال ، المناقشات الأولية لشروط العميل مع RabbitMQ، يظهر عملية معينة RPC. بمجرد اكتمال هذا التسلسل ، RabbitMQ سيكون جاهزًا لقبول الطلبات من العميل:
أيضا في المواصفات AMQP يمكن لكل من العميل والخادم إصدار الأوامر. هذا يعني أن العميل ينتظر التفاعل مع الخادم. الأوامر هي فئات وطرق. على سبيل المثال، Connection.Start - طريقة الاتصال Start فئة Connection.
الاتصال والقنوات
لتبادل المعلومات بين العميل والخادم ، قنوات. يتم إنشاء القنوات داخل اتصال محدد. كل قناة معزولة عن القنوات الأخرى. في حالة التزامن ، لا يمكن تنفيذ الأمر التالي حتى يتم تلقي استجابة.
لكي تتمكن من إرسال الأوامر بشكل متوازٍ ، عليك أن تفتح عدة قنوات. كل قناة تخلق منفصلة Erlang عملية. يمكن أن يحتوي اتصال واحد على قنوات متعددة (مضاعفة). لكل قناة ، هناك هياكل وكائنات معينة في الذاكرة. لذلك ، كلما زاد عدد القنوات الموجودة داخل اتصال ، فإن يستخدم RabbitMQ المزيد من الذاكرة لإدارة مثل هذا الاتصال.
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}
لا ننصح بشدة بفتح اتصال جديد لكل عملية يؤدي إلى ارتفاع التكاليف. يجب أن تكون القنوات ثابتة أيضًا ، ولكن العديد من أخطاء البروتوكول تتسبب في إغلاق القناة ، وبالتالي يمكن أن يكون عمر القناة أقصر من عمر الاتصال.
أين يتم استخدام RabbitMQ؟
في سياق الخدمات المصغرة ، البروتوكول AMQP وتنفيذه في RabbitMQ كثيرا ما تستخدم ل تفاعل غير متزامن بين الخدمات.
في السياق IIOT بروتوكول AMQP وتنفيذه في RabbitMQ تستخدم لتبادل البيانات بين الخوادم (الخادم - الخادم). أيضا باستخدام البرنامج المساعد MQTT البرنامج المساعد RabbitMQ وهو تطبيق للبروتوكول MQTT لنقل البيانات بين جهاز استشعار وخادم في بيئات منخفضة السرعة وعالية التأخير (للحصول على قائمة كاملة بالبروتوكولات المدعومة ، راجع موقع المشروع).
في المقالة التالية ، سنبدأ في فهم المزيد من التفاصيل مع التبادلات.