وضع العمل في RabbitMQ PHP

يشمل وضع العمل في RabbitMQ تكوين متعدد من المستهلكين لمعالجة الرسائل من نفس الطابور، مما يمكن زيادة سرعة المعالجة المتزامنة للرسائل. يُظهر الهندسة المعمارية في الرسم البياني أدناه:

وضع العمل في RabbitMQ

ملحوظة: بصرف النظر عن وضع العمل في 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: المكان الذي يتم فيه حفظ ملف سجل التشغيل.