حالت کاری RabbitMQ در PHP
حالت کاری در RabbitMQ شامل پیکربندی چندین مصرفکننده برای پردازش پیامها از یک صف مشترک است، که میتواند سرعت پردازش همزمان پیامها را افزایش دهد. معماری در دیاگرام زیر نشان داده شده است:
توجه: با وجود اینکه حالت کاری RabbitMQ مورد استفاده باشد، هر صف پشتیبانی میکند از چندین مصرفکننده، و یک پیام در همان صف فقط توسط یکی از مصرفکنندگان پردازش خواهد شد.
1. آموزش پیشنیاز
لطفاً برای درک دانش مربوطه، بخشهای زیر را بخوانید:
- مفاهیم اساسی RabbitMQ
- حالت کاری RabbitMQ
- شروع سریع برای PHP در RabbitMQ (یک مطالعه ضروری است، زیرا بخشهای بعدی کد را تکرار نمیکنند، فقط کد کلیدی را نشان میدهند)
2. پیادهسازی چندین مصرفکننده در PHP
PHP خود از فناوریهای همزمانی مانند چندنخی و کوروتین پشتیبانی نمیکند، بنابراین معمولاً از چندآغازی استفاده میکند تا پردازش همزمان را به دست آورد. در اینجا، ما از حالت چندآغازی برای پیادهسازی مصرفکنندگان همزمان در پردازش پیامها در صف استفاده میکنیم.
2.1. شروع دستی چند فرایند
برای پیادهسازی چند فرایند، سادهترین راه این است که به صورت دستی دستور PHP را چند بار اجرا کنیم.
برای مثال:
فرض کنید اسکریپت مصرفکننده از بخش قبلی recv.php
باشد، ما میتوانیم چندین پنجره شل باز کرده و به شکل زیر اسکریپت مصرفکننده را تکراری اجرا کنیم:
php recv.php
php recv.php
یا در یک پنجره شل همانطور که اسکریپت را در پسزمینه قرار دهیم اجرا کنیم:
php recv.php &
php recv.php &
توضیح: معایب پیادهسازی چندین مصرفکننده به صورت دستی این است که فرایندها به خوبی نگهداری نمیشوند و بدون نظارتی فرایندی. اگر یک فرایند خراب شود، به طور خودکار راهاندازی مجدد نمیشود.
2.2. استفاده از ناظر برای پیادهسازی چند فرایند
ناظر یک ناظر فرایند در سیستم عامل لینوکس است که میتواند فرایندهای PHP را نظارت کند. اگر یک فرایند PHP خراب شود، به طور خودکار راهاندازی مجدد میشود. همچنین میتواند همزمانی فرایندها را پیکربندی کند و اجرا کردن پردازش همزمان چندین مصرفکننده را آسان کند.
در ادامه یک مثال با استفاده از اوبونتو آورده شده است، مشابه برای توزیعهای لینوکس دیگر است.
نصب ناظر
sudo apt-get install supervisor
پیکربندی ناظر
فایل پیکربندی ناظر معمولاً در دایرکتوری /etc/supervisor/conf.d قرار دارد. در این دایرکتوری، میتوانید هر تعداد فایل پیکربندی ایجاد کنید تا ناظر را بگویید چگونه باید فرایندهای ما را نظارت کند. به عنوان مثال، میتوانید یک فایل به نام 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: جایی که فایل گزارش اجرا ذخیره میشود.