مقدمة إلى RabbitMQ ، الوسيط الذي يتعامل في الرسائل

مقدمة إلى RabbitMQ ، وسيط الرسائل ، ونموذج AMQP والمزيد.

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

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

إنها تجلب الفصل بين التطبيقات وتوفر طريقة فعالة للتواصل. مع وسطاء الرسائل ، لا يحتاج التطبيق إلى معرفة مسبقة بمستلميهم للتواصل.

ومع ذلك ، ما هو RabbtiMQ؟ كيف تناسب RabbitMQ في هذه الصورة؟ أيضًا ، ما هو AMQP؟

بنهاية هذا المقال سنتمكن من الإجابة على هذه الأسئلة. لقد أضفت أيضًا بعض الرسوم المتحركة بحيث يمكنك تصور مفاهيم RabbitMQ.

إذن هل أنت متحمس؟ انا! إذا واجهت صعوبات في فهم وسطاء الرسائل ، كما فعلت أنا ، فهذه المقالة هي المكان المناسب لبدء رحلتك. ابقى معي ؟

وسيط الرسائل

بشكل عام ، الوسيط هو الشخص الذي يسهل الصفقات بين المشتري والبائع. على سبيل المثال يمكن أن يكون وكيل عقارات أو سمسار البورصة.

وبالمثل ، إذا أردنا تبادل الرسائل بين مكونين برنامجيين موزعين ، فنحن بحاجة إلى وسيط. يُعرف هذا الوسيط باسم وسيط الرسائل. يتلقى الرسائل الواردة من المرسل ويرسلها إلى المستلم. بهذه الطريقة يمكن عزل المرسل والمستقبل تمامًا.

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

RabbitMQ كوسيط الرسائل

نحن نعلم الآن أن الغرض من وسيط الرسائل هو توجيه الرسائل من المنتج إلى المستهلك. دعنا نفحص وسيط رسائل واحد - RabbitMQ. إنه أحد وسطاء الرسائل الأكثر استخدامًا هذه الأيام.

تعتمد الطريقة التي يوجه بها RabbitMQ الرسائل على بروتوكول المراسلة الذي ينفذه. يدعم RabbitMQ بروتوكولات المراسلة المتعددة. ومع ذلك ، فإن الشيء الذي نهتم به هو AMQP. وهو اختصار لبروتوكول "وضع الرسائل في قائمة انتظار" المتقدم.

لذلك دون أي مزيد من اللغط ، دعونا نلقي نظرة فاحصة على نموذج بروتوكول AMQP.

بروتوكول وضع الرسائل في قائمة انتظار المتقدم

النموذج المفاهيمي لـ AMQP بسيط للغاية ومباشر. لديها ثلاثة كيانات:

  1. طابور
  2. ربط
  3. تبادل

عندما يدفع ناشر رسالة إلى RabbitMQ ، فإنها تصل أولاً إلى التبادل. يقوم التبادل بعد ذلك بتوزيع نسخ من هذه الرسائل على قوائم انتظار متصلة بشكل مختلف. أخيرًا ، يتلقى المستهلكون هذه الرسائل.

اعتبر الرسالة جزءًا من البيانات. إنها بالضرورة حزمة بها حمولة وبعض البيانات الوصفية. تحتوي الحمولة على بيانات كاملة بينما البيانات الوصفية هي خصائص يستخدمها RabbitMQ.

يصور الشكل 2 تمثيلاً رسوميًا لنموذج AMQP.

AMQP هو بروتوكول قابل للبرمجة. يتمتع المبرمجون بحرية استخدام المكتبات لتكوين الكيانات (التبادل والربط وقائمة الانتظار) وفقًا لاحتياجاتهم الخاصة. ليس لمسؤول RabbitMQ دور في إعداد هذه الكيانات.

هناك الكثير من المكتبات المتاحة للعمل مع RabbitMQ. يمكنك الاختيار من بين Nodejs و Python و .Net و Java وغيرها الكثير.

قوائم الانتظار

تشبه قوائم الانتظار هذه إلى حد ما قوائم الانتظار من فئات بنية البيانات لدينا. تتبع قوائم انتظار RabbitMQ أيضًا منهجية FIFO - First-In-First-Out. قائمة الانتظار هي مكان يخزن فيه RabbitMQ الرسائل / البيانات.

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

قبل المضي قدمًا ، من المهم أن تفهم من هو المستهلك المباشر لقوائم الانتظار هذه. علاوة على ذلك ، كم عدد الطرق التي يمكن للمستخدم أن يستهلك بها الرسائل من قائمة الانتظار؟

المستهلكون

المستهلكون هم من سيستخدمون الرسائل المخزنة في قائمة انتظار. من الممكن توصيل أكثر من مستهلك واحد بقائمة انتظار في وقت واحد. يمكن للمستهلكين إما سحب الرسالة من قائمة الانتظار من خلال تجميعها أو يمكن لقوائم الانتظار دفع الرسالة إلى العديد من المستهلكين المتصلين

الارتباطات

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

التبادلات وأنواعها

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

  • مباشرة
  • معجب في
  • موضوع
  • رأس

مباشرة

الاسم يشرح كل شيء! - يسلم التبادل المباشر رسالة مباشرة إلى قوائم الانتظار التي تفي بالشرط التالي:

Routing key == Binding key 

مفتاح التوجيه هو سمة من سمات الرسالة. من ناحية أخرى ، مفتاح الربط هو شيء تحدده أثناء إنشاء ارتباط بين قائمة انتظار وتبادل.

الشكل 3 هو شرح مرئي لكيفية تدفق الرسائل أثناء استخدام التبادل المباشر.

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

[صورة gif]

بمجرد وصول الرسالة إلى قائمة الانتظار المطلوبة (تغيير الحجم في حالتنا) ، يتم توزيعها بطريقة round robin لجميع المستهلكين المتصلين (resizer.1 / resizer.2 في حالتنا).

من خلال توزيع الرسائل بطريقة مستديرة ، يتأكد RabbitMQ من أن الرسائل متوازنة.

يجب أن تكون قد لاحظت أن قائمة الانتظار المسماة اقتصاص لا تتلقى أي رسائل. لأن مفتاح التوجيه في هذا المثال هو img.resize. لإرسال رسائل إلى قائمة الانتظار هذه ، نحتاج إلى إرسال رسائل بمفتاح توجيه يطابق مفتاح الربط ( img.crop على سبيل المثال).

معجب في

يتجاهل تبادل Fanout مفاتيح التوجيه ويوزع رسالة على جميع قوائم الانتظار المتصلة. لا عجب أن يطلق عليه Fanout (إرسال رسائل إلى جميع قوائم الانتظار المتصلة!؟).

إحدى حالات الاستخدام لهذا النوع من التبادل هي بث الرسائل.

يرجى ملاحظة أن RabbitMQ سيستمر في إجراء جولة روبن إذا كان هناك أكثر من مستهلك واحد لقائمة الانتظار.

موضوع

يقوم تبادل الموضوع بتوجيه رسالة عن طريق مطابقة مفتاح التوجيه بنمط موجود في مفتاح الربط.

Routing key == Pattern in binding key.

يستخدم RabbitMQ حرفين من أحرف البدل لمطابقة النمط *و #. استخدم *لمطابقة كلمة واحدة و #لمطابقة 0 أو أكثر من الكلمات.

الشكل 5 هو تصوير مرئي لتبادل الموضوع. الرسائل ذات مفتاح التوجيه - logs.errorستطابق الأنماط - logs.errorو logs.*. ومن ثم ستنتهي هذه الرسائل في قوائم الانتظار - only error و all logs.

بينما بالنسبة للمنتج الموجود في الجزء السفلي الأيسر ، فإن الرسائل التي تحتوي على مفتاح التوجيه - logs.successستطابق أنماط مفتاح الربط #success و logs.*. ومن ثم ستنتهي هذه الرسائل في قوائم الانتظار - all logsو only success.

[gif]

يحتوي هذا النوع من التبادل على مجموعة واسعة من حالات الاستخدام. يمكن استخدامه في نمط النشر والاشتراك ، وتوزيع البيانات ذات الصلة على عمليات العمال الراغبين وغير ذلك الكثير.

رأس

الرأس هو نوع معين من التبادل يوجه الرسائل بناءً على المفاتيح الموجودة في رأس الرسالة. إنه يتغاضى عن سمة التوجيه الرئيسية للرسالة.

عند إنشاء روابط لتبادل الرأس ، من الممكن ربط قائمة انتظار بمطابقة أكثر من رأس واحد. في مثل هذه الحالة ، يجب أن يعرف RabbitMQ من المنتج ما إذا كان يجب أن يتطابق مع كل هذه المفاتيح أو أي منها.

يمكن للمنتج / التطبيق القيام بذلك عن طريق توفير علامة إضافية تسمى "x-match". 'س مباراة "يمكن أن يكون anyأو allالقيم. الأول ينص على أن قيمة واحدة فقط يجب أن تتطابق بينما تنص الأخيرة على أن جميعها يجب أن تتطابق.

إقرار الرسالة

بمجرد وصول الرسالة إلى وجهتها ، يجب على الوسيط حذف الرسالة من قائمة الانتظار. إنه ضروري لأنه يمكن أن يحدث تجاوز سعة قائمة الانتظار إذا استمر في تراكم الرسائل.

قبل حذف أي رسالة ، يجب أن يكون لدى الوسيط إقرار بالتسليم. هناك طريقتان محتملتان للإقرار بتسليم الرسالة.

  1. إقرار تلقائي: بمجرد أن يتلقى المستهلك الرسالة
  2. إقرار صريح: عندما يرسل المستهلك إقرارًا

في معظم الحالات ، يتم استخدام إقرار صريح لأنه يتأكد من أن المستهلك قد استهلك الرسالة دون أي تجاوز فشل.

ماذا بعد

RabbitMQ هو منتج ناضج ومفيد للغاية. هذه المقالة ليست سوى مقدمة رفيعة المستوى لـ RabbitMQ. لقد قمت بتبسيط المفاهيم لتوفير نقطة مرجعية لك للمضي قدمًا. قم بزيارة موقع ويب RabbitMQ لمزيد من الموضوعات المعقدة.

اتمنى ان يعجبك المقال لا تنس أن تصفق (أو تصفق؟). اتبع لقراءة قصصي القادمة. حتى المرة القادمة ، حافظ على قائمة الانتظار.