حالت کاری RabbitMQ در PHP

حالت کاری در RabbitMQ شامل پیکربندی چندین مصرف‌کننده برای پردازش پیام‌ها از یک صف مشترک است، که می‌تواند سرعت پردازش همزمان پیام‌ها را افزایش دهد. معماری در دیاگرام زیر نشان داده شده است:

RabbitMQ حالت کاری

توجه: با وجود اینکه حالت کاری RabbitMQ مورد استفاده باشد، هر صف پشتیبانی می‌کند از چندین مصرف‌کننده، و یک پیام در همان صف فقط توسط یکی از مصرف‌کنندگان پردازش خواهد شد.

1. آموزش پیش‌نیاز

لطفاً برای درک دانش مربوطه، بخش‌های زیر را بخوانید:

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: جایی که فایل گزارش اجرا ذخیره می‌شود.