ما هي قائمة انتظار الرسائل؟
قائمة انتظار الرسائل هي حاوية تحفظ الرسائل أثناء عملية إرسال الرسائل، وهي في الأساس قائمة انتظار (الوارد أولاً يخرج أولاً).
تشير消息
إلى البيانات التي يجب إرسالها، والتي يمكن أن تكون نصًا أو سلسلة أو كائنًا ومعلومات أخرى.
消息队列
هي خدمة اتصال بين تطبيقين ويمكن产生者
الرسالة إعادتها فورًا بعد تخزين البيانات في قائمة انتظار الرسائل، دون انتظار استجابة接收者
الرسالة. أي: يتأكد生产者
من إدراج البيانات في قائمة الانتظار، ولا يهم من يتلقى الرسالة. يركز接收者
الرسالة فقط على تلقي الرسالة ومعالجتها.
ما هو
الفصل الذي يمكن أن تقوم به قائمة انتظار الرسائل، كما هو موضح أعلاه، حيث تفصل قائمة انتظار الرسائل بين منتج الرسالة ومستقبل الرسالة، ولا يتأثر أي منهما بالآخر.
غير المتزامن غير المتزامن هو تقليل وقت الاستجابة للطلبات، ويحتاج منتج الرسالة فقط إلى معالجة المنطق البسيط ووضع البيانات في قائمة انتظار الرسائل، ويتم التعامل مع المنطق المعقد، مثل عمليات قاعدة البيانات وعمليات الإدخال/الإخراج، بواسطة المتلقي الرسالة.
ذروة الحلاقة عندما يكون تطبيق قائمة انتظار الرسائل قيد الخدمة، يمكنه حفظ التدفق الفوري لمعلومات الطلب إلى قائمة انتظار الرسائل وإعادتها على الفور. تتم بعد ذلك معالجة الطلب بناءً على البيانات المقدمة من مستلم الرسالة.
سيناريوهات التطبيق: أنشطة الألعاب، وأنشطة البيع السريعة، ووضع الطلبات، وما إلى ذلك التي ستتسبب في زيادة فورية في حركة المرور.
بعد تقديم المعلومات الأساسية عن قائمة انتظار الرسائل، قبل تطوير قائمة انتظار الرسائل، دعونا نقدم بعض المفاهيم الأساسية لقائمة انتظار الرسائل ~
منتج الرسائل (المنتج) والمستهلك (العميل)
生产者
消费者
المذكورون أعلاه توفير
الروابط والقنوات وقوائم
الانتظار: يمثل رابطًا بين برنامج الخدمة وقائمة انتظار الرسائل. يمكن لبرنامج الخدمة إنشاء روابط متعددة .
القناة: قناة بين روابط قائمة انتظار الرسائل يمكن أن تحتوي على قنوات متعددة .
قائمة الانتظار: قائمة انتظار تقوم بتخزين البيانات في قائمة انتظار الرسائل. يمكن أن تحتوي خدمة قائمة انتظار الرسائل على قوائم انتظار متعددة.
خلاصة القول، العلاقة بين الروابط وقوائم انتظار القنوات هي على النحو التالي
يجب أن تحتوي قائمة انتظار رسائلالتبادل (التبادل)
على تبادل عند إرسال الرسائل . إذا لم يتم تحديد ذلك، فسيتم استخدام التبادل الافتراضي. يتمثل دور المحول في دفع الرسائل إلى قائمة الانتظار المقابلة. يوجد إجمالي 4 أنواع من المفاتيح في قائمة انتظار الرسائل
: مباشر: حدد وضع قائمة الانتظار. عندما تأتي رسالة، سيتم إرسالها فقط إلى قائمة الانتظار المحددة، ولن تستقبلها قوائم الانتظار الأخرى.
fanout: وضع البث، عندما تأتي رسالة، سيتم إرسالها إلى جميع قوائم الانتظار.
الموضوع: وضع المطابقة الغامضة، إعادة التوجيه المقابلة من خلال المطابقة الغامضة.
header: مشابه للوضع المباشر.
الشراب تثبيت Rabbitmq
ثم قم بزيارة http://localhost:15672/ محليًا لرؤية خلفية خدمة Rabbitmq. كلمة مرور الحساب الأولية هي guest
Amqplib عبارة عن مجموعة من الأدوات لاستخدام قوائم انتظار الرسائل في العقدة، مما يسمح لنا باستخدام قوائم انتظار الرسائل بسرعة.
إنشاء منتجالعنوان: https://www.npmjs.com/package/amqplib
/** مستهلك المنتج.js*/ const amqplib = require('amqplib'); const config = require('./config'); const {connectUrl } = config; (غير متزامن () => { اتصال ثابت = انتظار amqplib.connect(connectUrl); قناة const = انتظار الاتصال. createChannel(); const ExchangeName = 'testExchange'; مفتاح const = 'testQueue'; const sendMsg = 'hello Rabbitmq'; // تعرف على نوع التبديل الذي ينتظر القناة.assertExchange(exchangeName, 'fanout', { دائم: صحيح، }); // حدد قائمة انتظار في انتظار Channel.assertQueue(key); لـ (دع i = 0; i < 100; i++) { Channel.publish(exchangeName, key, Buffer.from(`${sendMsg} ${i}`)); } انتظر القناة. أغلق ()؛ في انتظار الاتصال. إغلاق ()؛ })();
بعد التشغيل، يمكنك أن ترى في الخلفية أنه تمت إضافة قائمة انتظار جديدة تحتوي على 100 رسالة.
خلق المستهلك/** customer.js المستهلك*/ const amqplib = require('amqplib'); const config = require('./config'); const {connectUrl } = config; (غير متزامن () => { دع الاتصال = انتظر amqplib.connect(connectUrl); const ExchangeName = 'testExchange'; مفتاح const = 'testQueue'; // أنشئ قناتين constchannel1 = انتظار Connection.createChannel(); قناة const2 = انتظار الاتصال. createChannel(); // حدد تبادلًا في انتظار Channel1.assertExchange(exchangeName, 'fanout', { دائم: صحيح، }); // حدد قائمة انتظار في انتظار Channel1.assertQueue(key); انتظر القناة 1.bindQueue (مفتاح، اسم التبادل، مفتاح)؛ القناة 1. تستهلك (مفتاح، (msg) => { console.log('القناة 1', msg.content.toString()); }); في انتظار القناة 2.assertExchange (exchangeName، 'fanout'، { دائم: صحيح، }); انتظر قناة 2.assertQueue(key); انتظر قناة 2.bindQueue (مفتاح، اسم التبادل، مفتاح)؛ قناة 2. تستهلك (مفتاح، (msg) => { console.log('القناة 2', msg.content.toString()); }); })();
بعد التنفيذ، يمكنك أن ترى أن كلا القناتين يمكن أن تعملا في نفس الوقت لتلقي الرسائل.