وضع العمل في RabbitMQ PHP
يشمل وضع العمل في RabbitMQ تكوين متعدد من المستهلكين لمعالجة الرسائل من نفس الطابور، مما يمكن زيادة سرعة المعالجة المتزامنة للرسائل. يُظهر الهندسة المعمارية في الرسم البياني أدناه:
ملحوظة: بصرف النظر عن وضع العمل في RabbitMQ المستخدم، يدعم كل طابور عدة مستهلكين، وستتم معالجة الرسالة في نفس الطابور من قبل أحد المستهلكين فقط.
١. الدورة التعليمية المسبقة
يرجى قراءة الأقسام التالية لفهم المعرفة ذات الصلة:
- مفاهيم RabbitMQ الأساسية
- وضع العمل في RabbitMQ]
- البداية السريعة لـ PHP في RabbitMQ (يجب قراءتها، حيث لن تُكرر الأقسام التالية الكود، بل ستظهر فقط الكود الرئيسي)
٢. تنفيذ عدة مستهلكين في PHP
PHP نفسه لا يدعم التقنيات المتزامنة مثل التعدد والجملة المتزامنة، لذلك عادة ما يستخدم متعدد العمليات لتحقيق المعالجة المتزامنة. هنا، نستخدم وضع عمليات متعددة لتنفيذ معالجين متزامنين لمعالجة الرسائل في الطابور.
٢.١. بدء عمليات متعددة يدويًا
لتنفيذ عمليات متعددة، أبسط طريقة هي بتشغيل الأمر الخاص بـ PHP مرارًا.
على سبيل المثال:
في افتراض أن سكريبت المستهلك من القسم السابق هو recv.php
، يمكننا فتح نوافذ الطرفية المتعددة وتنفيذ سكريبت المستهلك مرارًا مثل هذا:
php recv.php
php recv.php
أو في نفس نافذة الطرفية، يمكن وضع السكريبت في الخلفية لتشغيله بهذا الشكل:
php recv.php &
php recv.php &
توضيح: عيب تنفيذ عدة مستهلكين بهذه الطريقة اليدوية هو أن العمليات غير مُراقبة بشكل جيد، وليس هناك رصد للعملية. إذا تعطلت عملية، فلن تُعاد تشغيلها تلقائيًا.
٢.٢. استخدام Supervisor لتنفيذ عمليات متعددة
Supervisor هو مراقب للعمليات في نظام تشغيل Linux، يمكنه مراقبة عمليات PHP. إذا تعطلت عملية PHP، فسيتم إعادة تشغيلها تلقائيًا. كما يمكن تكوين تنافرية العمليات، مما يجعل من السهل تحقيق المعالجة المتزامنة للعديد من المستهلكين.
فيما يلي مثال باستخدام Ubuntu، ومشابه للتوزيعات الأخرى من Linux.
تثبيت Supervisor
sudo apt-get install supervisor
تكوين Supervisor
يُوجد الملف التكويني لـ Supervisor عادةً في دليل /etc/supervisor/conf.d. يمكنك إنشاء أي عدد من ملفات التهيئة في هذا الدليل لإخبار Supervisor كيفية مراقبة عملياتنا. على سبيل المثال، يمكن إنشاء ملف rabbitmq-worker.conf
لمراقبة عمليات المستهلك الخاصة بنا.
مثال: الملف: rabbitmq-worker.conf
[program:rabbitmq-worker]
process_name=%(program_name)s_%(process_num)02d
command=php recv.php
autostart=true
autorestart=true
user=root
numprocs=10
redirect_stderr=true
stdout_logfile=/var/log/worker.log
شرح المعاملات:
- process_name: تعريف اسم العملية، يمكن تسميتها بأي شكل. هنا، يُستخدم متغيران:
program_name
(اسم العملية) وprocess_num
(رقم العملية). - command: الأمر الذي نحتاج لتشغيله.
- autostart: ما إذا كان يتم بدء التشغيل تلقائيًا عند التمهيد.
- autorestart: ما إذا كان يتم إعادة التشغيل تلقائيًا.
- user: الحساب النظام الذي سيتم استخدامه لتشغيل الأمر.
- numprocs: عدد العمليات المتزامنة، مشيرًا إلى عدد العمليات التي يجب بدؤها.
- stdout_logfile: المكان الذي يتم فيه حفظ ملف سجل التشغيل.