استخدام RabbitMQ مع MonsterMQ الجزء 1

تم إعداد هذه المقالة لأولئك الذين ليسوا على دراية بقوائم الانتظار و RabbitMQ حتى الآن. أولئك الذين يعرفون بالفعل كيفية العمل مع RabbitMQ ويريدون فقط استكشاف الاحتمالات التي يوفرها MonsterMQ ، أوصي بزيارة صفحة المشروع على github.com ، حيث يصف الوصف بالتفصيل كيف يمكنك استخدام MonsterMQ دون وصف أساسيات العمل مع RabbitMQ. ستغطي بقية هذه المقالة أساسيات كيفية عمل RabbitMQ مع MonsterMQ.

RabbitMQ وسيط رسائل. يستقبل ويخزن ويرسل الرسائل لعملائه. يمكن لمرسلي ومستلمي الرسائل خدمة ، على سبيل المثال ، التطبيقات المكتوبة بلغة PHP. يحدث الاتصال بين العميل و RabbitMQ وفقًا لقواعد معينة تسمى AMQP (بروتوكول وضع الرسائل في قائمة انتظار متقدمة). على سبيل المثال ، الاتصال بين المتصفح الخاص بك وخادم الويب الذي توجد عليه هذه المقالة يتبع أيضًا قواعد معينة ، ويطلق عليها HTTP (بروتوكول نقل النص التشعبي) - بروتوكول نقل النص التشعبي. كل من HTTP و AMQP عبارة عن بروتوكولات لخادم العميل ، أي أنها تعني وجود عميل وخادم. RabbitMQ هو خادم AMQP ، و MonsterMQ هي مكتبة تسمح لك بكتابة عميل AMQP بسرعة في PHP ، والذي سيتواصل مع خادم AMQP.

تستخدم AMQP و RabbitMQ المصطلحات التالية:

الإنتاج - يعني إرسال الرسائل ، المنتج (المورد) - الشخص الذي يرسل الرسائل.

صورة

الاستهلاك - يعني استقبال الرسائل. المستهلك - الشخص الذي يتلقى الرسائل.

صورة

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

صورة

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

مرحبا بالعالم


لاحقًا في هذه المقالة ، سنكتب برنامجين PHP باستخدام مكتبة MonsterMQ ، أحدهما سيرسل الرسائل والآخر سيتلقىها ويخرجها إلى وحدة التحكم. في الشكل أدناه ، "P" هو الموفر ، "C" هو المستهلك ، والمربعات الحمراء هي قائمة الانتظار التي تمثل مخزن الرسائل المؤقت (كل مربع هو الرسالة).

صورة
(الصورة مأخوذة من موقع RabbitMQ الرسمي )

لمزيد من العمل ، نحتاج إلى تثبيت MonsterMQ ، للقيام بذلك ، أدخل الأمر التالي في وحدة التحكم:

composer require goootlib/monster-mq:dev-master

(يمكن العثور على مزيد من المعلومات حول تثبيت MonsterMQ في صفحة المشروع على github.com)
سيقوم هذا الأمر بتثبيت MonsterMQ في المجلد الحالي.

مغادرة


وسوف ندعو لدينا المرسل send.php ، والمتلقي receive.php . سينضم المرسل إلى الخادم ويرسل الرسالة.
للانضمام إلى الخادم، كتابة التعليمات البرمجية التالية في send.php :.

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');
} catch(\Exception $e) {
   var_dump($e);
}

في هذا الرمز ، ننضم إلى RabbitMQ يعمل على خادم محلي على منفذ قياسي. حدد عنوان IP آخر ومنفذًا إذا كان RabbitMQ يعمل على عنوانك الآخر. بعد الاتصال ، ندعو أيضًا طريقة تسجيل الدخول () ، التي تبدأ الجلسة باستخدام تسجيل الدخول وكلمة المرور القياسيين. إذا كان لديك حساب باسم مستخدم وكلمة مرور مختلفين تم تكوينهما في RabbitMQ ، فحددهما هنا.

لإرسال رسالة ، يجب أن نعلن قائمة الانتظار التي سيتم وضعها فيها أولاً. بعد الإعلان عن قائمة الانتظار ، يمكننا إرسال رسالة:

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->queue('test-queue')->declare();
   $producer->publish('my-message', 'test-queue');
} catch(\Exception $e) {
   var_dump($e);
}

تصريح قائمة الانتظار هو idempotent ، أي أنه لن يتم إنشاؤه ولن يغير قائمة الانتظار إذا كانت موجودة بالفعل. بعد الانتهاء من الجلسة والانضمام.

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->queue('test-queue')->declare();
   $producer->publish('Test message', 'test-queue');

   $producer->disconnect();
} catch(\Exception $e) {
   var_dump($e);
}

تلقي رسالة


على عكس المرسل ، سيظل المستلم قيد التشغيل للاستماع إلى الرسائل الواردة. في كود Rece.php ، عليك أولاً أن تفعل الشيء نفسه في send.php :

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $consumer->queue('test-queue')->declare();
} catch(\Exception $e) {
   var_dump($e);
}

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

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $consumer->queue('test-queue')->declare();

   $consumer->consume('test-queue');

   $consumer->wait(function ($message, $channelNumber) use ($consumer){
      echo "Message - {$message} received on channel {$channelNumber}";
   });
} catch(\Exception $e) {
   var_dump($e);
}

إطلاق


الآن يمكننا تشغيل كلا النصين كمستلم:

php receive.php

لذلك المرسل:

php send.php

سيقوم المستلم بإخراج الرسالة التي سيتلقاها من RabbitMQ (والتي بدورها سوف تستقبلها من send.php) ورقم القناة المستخدمة. سيستمر تنفيذه حتى تغلق المحطة ، أو حتى تتوقف عن تنفيذها بالضغط على Ctrl + C. من خلال تشغيل المرسل في محطة طرفية أخرى ، يمكنك ملاحظة كيفية تسليم الرسائل إلى المستلم وعرضها في وحدة التحكم.

إذا كنت ترغب في معرفة أي RabbitMQ يحتوي في الوقت الحالي على قوائم الانتظار وعدد الرسائل الموجودة فيها ، يمكنك القيام بذلك كمستخدم مميز باستخدام rabbitmqctl
sudo rabbitmqctl list_queues


على النوافذ لا تستخدم sudo
rabbitmqctl.bat list_queues


الآن نحن على استعداد للانتقال إلى الجزء التالي من دروسنا.

All Articles