Laravel में Queues और Jobs को Redis या Database के साथ कैसे उपयोग करें,

Back to Home

Laravel में Queues और Jobs को Redis या Database के साथ कैसे उपयोग करें,

Category: Laravel
Laravel में Queues और Jobs को Redis या Database के साथ कैसे उपयोग करें,
जब हम Laravel में कुछ ऐसे काम करते हैं जो समय लेते हैं — जैसे ईमेल भेजना, फ़ोटो को प्रोसेस करना, रिपोर्ट जेनरेट करना, API कॉल करना आदि — तो उसे सीधे HTTP request-response चक्र में करना फ़ायदे के बजाय नुकसान पहुंचा सकता है।
ऐसा करने से यूज़र को लोड टाइम अत्यधिक बढ़ जाता है और वे इंतज़ार करेंगे। इस समस्या का हल है Queues & Jobs — यानी समय लेने वाले कामों को अलग (background) में करना।

Laravel की Queues आपको ये सुविधा देती है कि आप “Jobs” (टास्क) को एक Queue में डालें, और बाद में एक Worker उन Jobs को प्रोसेस करे।

और आप यह स्टोर कर सकते हैं Redis में या Database (DB) में — दो लोकप्रिय विकल्प।

नीचे हम दोनों विधियों को उदाहरण सहित समझेंगे, और उनकी खूबियाँ व कमियाँ देखेंगे।

Queues & Jobs — मूल अवधारणा
एक सरल analogy से समझें:

आप एक पोस्‍ट ऑफिस की कल्पना करें — Incoming Post (Jobs) एक लिस्ट में आती हैं (Queue)

डाकिया (Worker) आती है और एक-एक पोस्ट उठाती है, पढ़ती है, और डिलीवर करती है

इसी प्रकार, Laravel में आप किसी काम को “Dispatch” करते हैं — वो एक Job बनता है और Queue में डाला जाता है

एक Worker रन होता है — वो लगातार Queue से Jobs लेता है और उनका handle() method execute करता है

Laravel docs बताते हैं कि Queues के लिए कई डिफ़ॉल्ट ड्राइवर होते हैं — database, Redis, SQS आदि



Database आधारित Queue
सेटअप
.env में सेट करें:

QUEUE_CONNECTION=database
Artisan कमांड से Queue टेबल बनाएँ:


php artisan queue:table
php artisan migrate
इससे आपके database में एक jobs नामक टेबल बन जाएगी।

Job बनाना
php artisan make:job SendWelcomeEmail
इससे app/Jobs/SendWelcomeEmail.php बन जाता है।

उसमें आप handle() method में वो काम लिखेंगे जो करनी है, जैसे ईमेल भेजना।

Dispatch (Job को भेजना)
कहीं controller या Service में:

SendWelcomeEmail::dispatch($user);
Worker चलाना
php artisan queue:work
इससे database queue से jobs उठकर execute होंगे।

फायदे / नुक़सान
फायदे

Reliable — अगर server restarts हो जाएँ, jobs DB में मौजूद रहेंगी

देख-रेख आसान — DB में आप count कर सकते हैं कि कितने jobs in queue हैं

नुकसान

DB driver पर load ज़्यादा हो सकता है, lock contention आदि सकते हैं

Redis जितनी fast performance नहीं दे पाएगा

Redis आधारित Queue
Redis एक in-memory data store है — बहुत तेज़ी से read/write कर सकता है। इसलिए queues के लिए Redis एक आम और पसंदीदा विकल्प है। Laravel Redis queue driver को सपोर्ट करता है।

सेटअप
.env में:

QUEUE_CONNECTION=redis
REDIS_QUEUE=default
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
config/queue.php में Redis connection चेक करें — block_for, retry_after आदि ऑप्शन्स हैं

Job बनाना & Dispatch करना
यहाँ भी वही प्रक्रिया — php artisan make:job ..., और MyJob::dispatch(...)

Worker चलाना
php artisan queue:work redis
यदि आप विशेष queue नाम देना चाहें:


php artisan queue:work redis --queue=emails
``` :contentReference[oaicite:5]{index=5}

### फायदे / चुनौतियाँ
**फायदे**
- बहुत तेज़ प्रोसेसिंग — Redis in-memory होने के कारण
- अधिक concurrent requests संभाले जा सकते हैं

**चुनौतियाँ**
- Redis volatile हो सकती है — אם Redis crash हो जाए या reboot हो जाए तो jobs गुम हो सकते हैं
- इसलिए, production में, अनेक लोग Redis + fallback storing (DB या logging) का मिश्रण उपयोग करते हैं

एक reddit उपयोगकर्ता ने लिखा:
> “I used database queue … जब server बंद हो जाए तो jobs database में मौजूद रहती हैं … Redis में crash हो जाए तो jobs खो सकती हैं” :contentReference[oaicite:6]{index=6}

---

## Database + Redis का मिश्रण (Hybrid Approach)

कुछ advanced setups में यह देखा जाता है कि jobs एक record DB में रखें जाते हैं (status, metadata) और execution queue Redis में डाली जाती है। इस तरह:

- Failover सुरक्षा बनी रहती है
- Redis की performance मिलती है
- DB में आप history tracking रख सकते हैं

यह तकनीक विशेष बड़े प्रोजेक्ट्स में उपयोगी है।

---

## Error Handling, Retry & Failures

Laravel Queues में built-in mechanism है कि अगर कोई Job विफल हो जाए (exception), तो वो retry किया जाए:

- आप `public $tries = 3;` लिख सकते हैं job में
- `retry_after` सेट कर सकते हैं कि कितनी देर बाद retry हो
- Failed jobs को आप `failed_jobs` टेबल में स्टोर कर सकते हैं

किसी job के fail होने पर, आप उसकी details देख सकते हैं और decide कर सकते हैं कि manual fix करें या discard करें।

---

## Supervisor / Daemon & Queue Management

Queue worker को हमेशा चलाते रहना चाहिए (daemon), ताकि जब भी नया Job आए, वो तुरंत execute हो जाए। इसके लिए Linux में tools जैसे **Supervisor**, **systemd** आदि उपयोग किए जाते हैं।

Worker अचानक बंद हो जाए (exception, crash), तो Supervisor उसे auto-restart कर देगा।

Redis आधारित queue system के लिए Laravel Horizon भी एक dashboard + management tool प्रदान करता है (Redis queues के लिए)। :contentReference[oaicite:7]{index=7}

---

## उदाहरण कोड (संक्षिप्त)

```php
// app/Jobs/ProcessData.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 ProcessData implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

protected $payload;

public function __construct(array $payload)
{
$this->payload = $payload;
}

public function handle()
{
// अपना लॉजिक यहाँ — जैसे DB insert, API call, etc.
\Log::info('Processing payload: ', $this->payload);
}
}

// कहीं Controller में
use App\Jobs\ProcessData;

public function submit(Request $req)
{
$data = $req->all();
ProcessData::dispatch($data);
return response()->json(['status' => 'Job dispatched']);
}
Worker चलाएँ:


php artisan queue:work --tries=3
कब कौन सा उपयोग करें
उपयोग स्थिति सुझाव
छोटे-से-मध्यम एप्लिकेशन, सीमित concurrency Database queue ठीक है
high performance, बहुत सारी background tasks Redis queue बेहतर विकल्प
mission-critical app जिसमें data loss बिलकुल नहीं हो Hybrid approach (Redis + DB)
monitoring, dashboard चाहिए


Redis + Horizon उपयोग करें


Laravel Queues & Jobs हमें background में tasks चलाने की शक्ति देती है।

Redis तेज़ है, लेकिन volatile हो सकती है।

Database reliable है, लेकिन performance कम हो सकती है under load.

अच्छा architecture चुनना depends करता है आपके project की load, failure tolerance और resources पर।