Mengatasi Bottleneck Push Notification pada Backend Laravel Skala Besar

Mengatasi Bottleneck Push Notification pada Backend Laravel Skala Besar

Push notification merupakan salah satu komponen penting dalam arsitektur aplikasi modern, terutama untuk memberikan informasi secara real-time kepada pengguna. Namun, dalam implementasinya, sistem pengiriman push notification dapat menjadi tantangan tersendiri, khususnya ketika sistem harus menangani ribuan notifikasi dalam waktu singkat.

Pada tulisan kali ini, saya akan membagikan studi kasus dari salah satu klien yang mengalami permasalahan serius dalam pengiriman push notification menggunakan Laravel, serta solusi arsitektur yang saya tawarkan untuk mengatasinya.


Permasalahan yang Dihadapi

Klien menggunakan Laravel sebagai backend utama, serta Firebase Cloud Messaging (FCM) sebagai gateway untuk pengiriman notifikasi ke perangkat Android dan iOS. Beberapa kendala utama yang muncul dalam sistem mereka antara lain:

  1. Queue dijalankan melalui cronjob
    Laravel sebenarnya telah menyediakan sistem antrian (queue) bawaan yang cukup baik. Namun, pada kasus ini, eksekusi antrian dilakukan melalui cronjob yang berjalan setiap satu menit. Pendekatan ini menyebabkan jeda antara waktu push masuk dan waktu eksekusi, sehingga notifikasi sering kali terlambat diterima oleh pengguna.
  2. Keterbatasan performa PHP dalam multitasking
    Karena PHP secara native tidak mendukung multithreading secara optimal, eksekusi tugas dalam jumlah besar menjadi sangat terbatas. Hal ini menyebabkan antrian proses menumpuk, terutama saat terjadi lonjakan notifikasi secara tiba-tiba.
  3. Kurangnya skalabilitas sistem
    Cronjob dan single-threaded worker membuat sistem tidak fleksibel untuk menskalakan proses pengiriman notifikasi, baik secara horizontal maupun vertikal.

Solusi Arsitektural yang Diusulkan

Untuk mengatasi permasalahan di atas, saya menyarankan beberapa langkah perbaikan arsitektur sebagai berikut:

1. Migrasi sistem antrian ke RabbitMQ

RabbitMQ adalah message broker yang andal dan mendukung pemrosesan pesan dalam throughput tinggi. Dengan menggunakan RabbitMQ, backend Laravel tidak lagi bertanggung jawab langsung terhadap eksekusi push notification, melainkan hanya bertindak sebagai pengirim pesan ke queue yang kemudian akan ditangani oleh worker terpisah.

2. Implementasi worker menggunakan Python

Mengapa Python? Karena Python menyediakan pendekatan multitasking yang lebih fleksibel melalui berbagai metode seperti threadingasyncio, hingga multiprocessing. Selain itu, Python memiliki pustaka yang mendukung komunikasi dengan Firebase secara efisien, seperti pyfcm atau aiohttp.

Dengan pendekatan ini, satu worker dapat menangani banyak notifikasi secara paralel, sehingga bottleneck dapat diminimalkan secara signifikan.

3. Skalabilitas sistem dengan pendekatan distributed worker

Dengan arsitektur berbasis message broker seperti RabbitMQ, kita dapat menambahkan worker secara horizontal (misalnya melalui Docker container atau proses background tambahan) tanpa perlu mengubah struktur backend utama. Pendekatan ini memungkinkan sistem untuk menyesuaikan skala sesuai kebutuhan trafik.

4. Monitoring dan observabilitas

Setiap sistem distributed perlu dibarengi dengan monitoring yang baik. Untuk sistem ini, saya menggunakan kombinasi dari:

  • Prometheus untuk metrics dasar seperti penggunaan CPU, memory, dan throughput pesan,
  • Grafana untuk visualisasi data,
  • Sentry atau ELK Stack untuk logging dan error tracking,
  • RabbitMQ Management Plugin untuk memantau antrian secara real-time.

Langkah ini sangat penting untuk mendeteksi bottleneck sedini mungkin dan memastikan sistem tetap berjalan optimal di bawah beban tinggi.


Pengalaman Terkait

Saya pernah memiliki pengalaman dalam menangani antrian berskala besar, salah satunya saat bekerja di sebuah perusahaan yang mengembangkan produk media monitoring dan analisis sentimen. Saat itu, kami menggunakan RabbitMQ sebagai sistem antrian utama. Pesan-pesan dari sistem akan diproses oleh beberapa worker yang berjalan secara paralel di banyak node, dan masing-masing worker mengandalkan multithread untuk memproses pesan dengan lebih cepat. Pendekatan ini terbukti sangat efektif dalam mempercepat penyelesaian antrian besar yang terus masuk secara real-time.


Arsitektur Sistem yang Diterapkan


Hasil yang diharapkan

Setelah implementasi solusi ini, hasil yang ingin dicapai adalah:

  • Waktu pengiriman notifikasi menjadi lebih cepat dan konsisten
  • Beban proses terdistribusi secara merata
  • Sistem menjadi lebih mudah disesuaikan dengan skala trafik pengguna
  • Penggunaan resource menjadi lebih efisien, tanpa perlu menambah beban pada aplikasi Laravel utama
  • Meningkatnya visibilitas sistem melalui monitoring dan observabilitas yang baik

Karena beberapa hal, solusi ini belum bisa diimplementasi saat itu sampai saya selesai kontrak kerja sama dengan mereka. Semoga solusi yang saya berikan dapat mengatasi masalah yang bertahun-tahun terjadi di sana.


Kesimpulan

Push notification pada skala besar memerlukan pendekatan arsitektur yang tepat. Laravel queue memang dapat digunakan dalam berbagai kasus, tetapi jika tidak dikonfigurasi dengan baik—seperti menggunakan cronjob untuk pemrosesan—maka performa sistem akan menurun secara drastis.

Dengan memisahkan tanggung jawab melalui message broker seperti RabbitMQ dan memanfaatkan worker yang lebih fleksibel seperti Python, sistem dapat menangani proses secara paralel, efisien, dan scalable.


Begitulah kira-kira tulisan saya kali ini. Kalau pembaca ingin membaca beberapa tulisan saya lainnya, bisa buka di tautan ini.

Leave a Reply