🚀 Notification Queue System
Sistem ini menyediakan REST API untuk membuat job pengiriman notifikasi (email/SMS) dan worker process yang memproses job secara paralel dengan mekanisme retry, exponential backoff, jitter, idempotency, dan anti–double-processing.
✅ Fitur Utama
| Fitur | Penjelasan |
|---|---|
| POST /api/notifications | Menciptakan job pengiriman notifikasi secara asynchronous |
| Idempotency Key | Request duplikat tidak membuat job baru |
| Worker | Memproses job dengan status PENDING / RETRY |
| Retry otomatis | Menggunakan exponential backoff + jitter |
| Anti double-processing | Aman untuk banyak worker paralel (concurrency-safe) |
| Queue Stats | Endpoint untuk melihat statistik job |
📌 1. Cara Menjalankan Aplikasi
✅ A. Install Dependencies
composer installSilakan sesuaikan .env anda dengan .env.example
✅ B. Jalankan migrasi database
php artisan migrateSecara default akan berjalan pada: http://localhost:8000/
✅ C. Menjalankan REST API
php artisan serveAnda dapat melihat contoh Request API melalui collection Postman berikut:
✅ D. Menjalankan Worker
Silakan buka command prompt anda dan ketik:
php artisan queue:notification --limit=<limit of worker> --sleep=<sleep per seconds>Sebagai contoh limit 10 dengan sleep 2 detik:
php artisan queue:notification --limit=10 --sleep=2📌 2. Keputusan Teknis Utama
✅ Mengapa tidak memakai Redis Queue / Laravel Horizon?
Untuk memenuhi requirement challenge, seluruh mekanisme dibangun manual menggunakan:
-
Tabel notification_jobs
-
Worker custom
-
Locking / concurrency-safe
-
Retry logic dan backoff
Hal ini menunjukkan pemahaman sistem queue internal tanpa bergantung pada library queue Laravel.
✅ Mengapa PostgreSQL?
Karena PostgreSQL mendukung:
FOR UPDATE SKIP LOCKEDPerintah ini memungkinkan banyak worker paralel menarik job tanpa race condition.
MySQL/MariaDB hanya mendukung fitur ini pada versi tertentu dan sering bermasalah.
📌 3. Strategi Retry, Backoff, dan Jitter
Sistem menerapkan exponential backoff:
next_delay_seconds = (2 ^ attempts) + random_jitterTujuannya:
✅ Menghindari spam retry sekaligus
✅ Mengurangi efek “retry storm" jika banyak job gagal bersamaan
✅ Mendistribusikan retry pada waktu acak
Jika attempts >= max_attempts, job berubah menjadi FAILED
📌 4. Mekanisme Anti Double-Processing
Sistem harus aman dengan banyak worker paralel.
✅ Solusinya:
SELECT ... FOR UPDATE SKIP LOCKEDKetika worker menarik job:
Database mengunci baris (row-level lock)
Job hanya bisa diklaim oleh satu worker
Worker lain akan melewati row yang terkunci (SKIP LOCKED)
Status langsung diubah ke PROCESSING
✅ Tidak ada dua worker yang memproses job sama
✅ Jika worker mati tiba-tiba → job tetap aman dan bisa diproses ulang saat next_run_at tercapai
✅ Full concurrency-safe tanpa Redis
❓ Bantuan / Kontak
Jika terdapat kendala atau pertanyaan lebih lanjut, silakan hubungi:
📧 Email: ecepentis@gmail.com 📱 WhatsApp: 0896-5842-0438
Regards,
Ecep Achmad Sutisna