Queue System: معالجة ذكية للطلبات

2025-11-27 وقت القراءه : 3 دقائق

المفهوم الأساسي

بدلاً من معالجة جميع الطلبات فورًا (مما قد يسبب انهيار النظام)، نستخدم نظام Queue في Laravel لمعالجة الطلبات بشكل تسلسلي في الخلفية.


كيف يعمل النظام في Laravel؟

  1. استقبال فوري: المستخدم يرسل الطلب ويحصل على رد سريع
  2. الإضافة للـ Queue: يتم وضع الطلب في Queue للمعالجة اللاحقة
  3. المعالجة في الخلفية: Queue Workers تعالج الطلبات واحدًا تلو الآخر
  4. إشعار المستخدم: بعد إتمام المعالجة، يتم إرسال إشعار


Queue Drivers المتاحة في Laravel

Laravel يدعم عدة Queue Drivers، كل واحد له استخداماته:

1. Database Queue (للتطبيقات الصغيرة)

bash# إنشاء جداول Queue
php artisan queue:table
php artisan queue:failed-table
php artisan migrate
env# في .env
QUEUE_CONNECTION=database
php// إنشاء Job جديد
php artisan make:job ProcessOrder

// app/Jobs/ProcessOrder.php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessOrder implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    public function __construct(
        public Order $order
    ) {}
    
    public function handle(): void
    {
        // معالجة الطلب
        $this->order->process();
        
        // إرسال إشعار
        $this->order->user->notify(new OrderProcessed($this->order));
    }
}
php// في Controller
public function store(Request $request)
{
    $order = Order::create($request->validated());
    
    // إضافة للـ Queue
    ProcessOrder::dispatch($order);
    
    return response()->json([
        'message' => 'تم استلام طلبك بنجاح وسيتم معالجته قريباً',
        'order_id' => $order->id
    ], 202); // 202 Accepted
}
bash# تشغيل Queue Worker
php artisan queue:work


2. Redis Queue (للإنتاج - موصى به)

Redis هو الخيار الأفضل للإنتاج لأنه سريع وموثوق:

bash# تثبيت Redis
composer require predis/predis
env# في .env
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
php// في config/queue.php
'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => env('REDIS_QUEUE', 'default'),
    'retry_after' => 90,
    'block_for' => null,
    'after_commit' => false,
],
php// استخدام Queues مختلفة حسب الأولوية
ProcessOrder::dispatch($order)->onQueue('high');
SendWelcomeEmail::dispatch($user)->onQueue('emails');
GenerateReport::dispatch($data)->onQueue('low');
bash# تشغيل Workers لـ queues مختلفة
php artisan queue:work redis --queue=high,default,low,emails


3. Laravel Horizon (لإدارة Redis Queues)

Horizon يوفر لوحة تحكم جميلة لمراقبة الـ Queues:

bashcomposer require laravel/horizon
php artisan horizon:install
php artisan migrate
php// في config/horizon.php
'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['high', 'default'],
            'balance' => 'auto',
            'maxProcesses' => 10,
            'maxTime' => 0,
            'maxJobs' => 0,
            'memory' => 128,
            'tries' => 3,
            'timeout' => 60,
        ],
        'supervisor-2' => [
            'connection' => 'redis',
            'queue' => ['emails', 'notifications'],
            'balance' => 'auto',
            'maxProcesses' => 5,
            'tries' => 2,
            'timeout' => 30,
        ],
    ],
],
bash# تشغيل Horizon
php artisan horizon


# الوصول للـ Dashboard
# http://your-app.com/horizon



Job Chaining & Batching

Laravel يدعم سلاسل Jobs معقدة:

phpuse Illuminate\Support\Facades\Bus;


// سلسلة Jobs
Bus::chain([
    new ProcessOrder($order),
    new UpdateInventory($order),
    new SendInvoice($order),
    new NotifyUser($order),
])->dispatch();


// Batch Jobs مع معالجة النجاح والفشل
Bus::batch([
    new ProcessPayment($order1),
    new ProcessPayment($order2),
    new ProcessPayment($order3),
])->then(function (Batch $batch) {
    // جميع Jobs نجحت
})->catch(function (Batch $batch, Throwable $e) {
    // أول job فشل
})->finally(function (Batch $batch) {
    // انتهى الـ batch
})->dispatch();


الفوائد الرئيسية

✅ تجربة مستخدم أفضل: استجابة فورية دون انتظار

✅ استقرار النظام: معالجة منظمة تمنع التحميل الزائد

✅ قابلية التوسع: يمكن إضافة Workers إضافيين بسهولة

✅ الموثوقية: في حالة فشل Job، يمكن إعادة المحاولة تلقائياً

إضافة تعليق
Loading...