slogan3

Ontwikkel een Geavanceerde Laravel Queue en Job Scheduler voor Efficiënte Taakafhandeling

description

Met deze prompt kan de gebruiker een robuust asynchroon taakverwerkingssysteem opzetten binnen Laravel, waardoor zware of tijdrovende processen efficiënt worden afgehandeld zonder de gebruikerservaring te beïnvloeden. Het helpt bij het verbeteren van de schaalbaarheid en betrouwbaarheid van de backend ten opzichte van standaard synchronisatie.

prompt

Help me een geavanceerd queue- en job scheduler-systeem te ontwerpen in Laravel dat taken asynchroon verwerkt voor <beschrijf de taak of het proces>. Leg uit hoe ik queues, jobs, en schedu ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van hoe je een geavanceerd queue- en job scheduler-systeem in Laravel kunt opzetten voor asynchrone e-mail notificaties na gebruikersregistratie, inclusief configuratie, optimalisatie en best practices. ### 1. Laravel Queue Configuratie #### a. Queue Drivers Laravel ondersteunt verschillende queue drivers, afhankelijk van je infrastructuur en schaalbehoeften: - **Database**: eenvoudig te gebruiken, geschikt voor kleine tot middense schaal. - **Redis**: snel en schaalbaar, ideaal voor hoge doorvoer. - **SQS (Amazon Simple Queue Service)**: voor cloud-gebaseerde schaalbaarheid. - **Beanstalkd**: lichte en snelle queue. - **Sync**: directe uitvoering (voor ontwikkeling of tests). **Voorbeeld: Redis configuratie** ```php // .env QUEUE_CONNECTION=redis // config/queue.php 'connections' => [ 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ], ], ``` Zorg dat Redis draait en dat je de juiste verbinding hebt ingesteld. ### 2. Jobs maken en gebruiken Maak een job voor het versturen van e-mails: ```bash php artisan make:job SendWelcomeEmail ``` In `app/Jobs/SendWelcomeEmail.php`: ```php namespace App\Jobs; use Mail; use App\Mail\WelcomeMail; use App\Models\User; class SendWelcomeEmail extends Job { protected $user; public function __construct(User $user) { $this->user = $user; } public function handle() { Mail::to($this->user->email)->send(new WelcomeMail($this->user)); } } ``` ### 3. Taken dispatchen bij gebruikersregistratie In je registratiecontroller: ```php use App\Jobs\SendWelcomeEmail; public function register(Request $request) { // Validatie en user creatie $user = User::create($request->all()); // Job dispatchen SendWelcomeEmail::dispatch($user); return response()->json(['message' => 'Gebruiker geregistreerd en notificatie verstuurd.']); } ``` ### 4. Scheduler instellen voor periodieke taken Gebruik Laravel’s scheduler voor taken zoals het opnieuw proberen van geslaagde jobs of het opschonen van failed jobs. Configureer `app/Console/Kernel.php`: ```php protected function schedule(Schedule $schedule) { // Herproberen failed jobs $schedule->command('queue:retry all')->daily(); // Opschonen van failed jobs $schedule->command('queue:flush')->weekly(); } ``` Voer via cron uit: ```bash * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 ``` ### 5. Optimalisatie en schaalbaarheid - **Maximaal aantal workers**: Start meerdere queue workers voor parallel verwerking: ```bash php artisan queue:work redis --daemon --sleep=3 --tries=3 --timeout=90 ``` Gebruik process management tools zoals Supervisor om deze automatisch te beheren. - **Retries en failed jobs** - Stel `retry_after` in (bijvoorbeeld 90 seconden) om jobs opnieuw te proberen. - Beheer failed jobs via: ```bash php artisan queue:failed php artisan queue:retry [id] php artisan queue:retry all php artisan queue:flush ``` - Voor persistente opslag van failed jobs gebruik je de database of Redis. - **Monitoring** - Gebruik Laravel Horizon voor Redis queues, voor realtime monitoring en beheer. - Configureer alerts bij teveel failed jobs. ### 6. Extra tips voor prestaties - Gebruik batching en chunking voor grote hoeveelheden data. - Optimaliseer je e-mail templates en gebruik queue prioritization. - Schaal horizontaal door meerdere workers op verschillende servers te draaien. - Zorg dat je database en Redis voldoende resources hebben. --- Met deze opzet heb je een robuust, schaalbaar systeem voor asynchrone verwerking van e-mail notificaties in Laravel, dat makkelijk te beheren en te optimaliseren is.
provider: deepseek
model: deepseek-chat
Zeker! Ik help je bij het ontwerpen van een geavanceerd queue- en job scheduler-systeem in Laravel voor e-mailnotificaties. ## Configuratie van Queues en Jobs ### 1. Queue Driver Keuze Voor productie gebruik je best: - **Redis** (aanbevolen voor hoge prestaties) - **RabbitMQ** (voor enterprise-omgevingen) - **Amazon SQS** (voor cloud-schaling) ```bash composer require predis/predis # Voor Redis ``` ### 2. Environment Configuratie (.env) ```env QUEUE_CONNECTION=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 ``` ### 3. Job Aanmaken ```bash php artisan make:job SendRegistrationEmail ``` ```php <?php namespace App\Jobs; use App\Models\User; use App\Mail\WelcomeEmail; use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\Mail; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class SendRegistrationEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $tries = 3; public $maxExceptions = 2; public $timeout = 60; public $backoff = [30, 60, 120]; protected $user; public function __construct(User $user) { $this->user = $user; } public function handle() { Mail::to($this->user->email) ->send(new WelcomeEmail($this->user)); } public function failed(\Throwable $exception) { // Log de fout of stuur notificatie \Log::error('Registration email failed: ' . $exception->getMessage()); } } ``` ### 4. Gebruik in Controller ```php public function register(Request $request) { // Validatie en gebruiker aanmaken $user = User::create($request->validated()); // Job dispatchen SendRegistrationEmail::dispatch($user) ->onQueue('emails') ->delay(now()->addSeconds(30)); return response()->json(['message' => 'Registration successful']); } ``` ## Optimalisatie voor Prestaties ### 1. Queue Worker Configuratie ```bash # Voor hoge doorvoer php artisan queue:work redis --queue=emails,default --tries=3 --timeout=60 --sleep=3 --backoff=30 ``` ### 2. Supervisor Configuratie ```ini [program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /path/to/artisan queue:work redis --sleep=3 --tries=3 --max-jobs=1000 --max-time=3600 autostart=true autorestart=true user=www-data numprocs=8 redirect_stderr=true stdout_logfile=/var/log/worker.log ``` ### 3. Horizon voor Geavanceerd Beheer ```bash composer require laravel/horizon php artisan horizon:install ``` ```php // config/horizon.php 'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['emails'], 'processes' => 10, 'tries' => 3, 'timeout' => 60, ], ], ], ``` ## Failed Jobs Beheer ### 1. Failed Job Table ```bash php artisan queue:failed-table php artisan migrate ``` ### 2. Failed Job Commands ```bash # Bekijk failed jobs php artisan queue:failed # Retry failed jobs php artisan queue:retry all # Verwijder failed job php artisan queue:forget 5 # Leeg failed jobs php artisan queue:flush ``` ### 3. Automatisch Retry Beheer ```php // AppServiceProvider.php public function boot() { Queue::failing(function (JobFailed $event) { // Automatische notificatie bij falen }); } ``` ## Scheduler Configuratie ```php // app/Console/Kernel.php protected function schedule(Schedule $schedule) { // Controleer failed jobs elk uur $schedule->command('queue:retry all --queue=emails') ->hourly() ->onFailure(function () { // Notificatie sturen }); // Opruimen oude failed jobs $schedule->command('queue:prune-failed --hours=48')->daily(); } ``` ## Monitoring en Logging ```php // Log queue metrics Queue::looping(function () { Metrics::increment('queue.jobs.processed'); }); // Performance monitoring class SendRegistrationEmail implements ShouldQueue { public function handle() { $start = microtime(true); // Uitvoering logica \Log::info('Email job completed', [ 'duration' => microtime(true) - $start, 'memory' => memory_get_peak_usage() ]); } } ``` ## Schaalbaarheidsstrategieën 1. **Multiple Queues**: Verdeel verschillende job types over aparte queues 2. **Dynamic Scaling**: Auto-scaling based on queue length 3. **Rate Limiting**: Beperk aantal e-mails per tijdseenheid 4. **Database Indexing**: Optimaliseer queue tabel indexes ```bash # Voor monitoring queue lengte php artisan queue:monitor redis:emails,redis:default ``` Dit systeem biedt robuuste verwerking van e-mailnotificaties met goede fouthandeling, schaalbaarheid en prestatiemonitoring.