BOQ Tracker — Telkom Infra (Medianet Technology)
Export XLSX 100.000+ baris berjalan di dalam request cycle dan sering terhenti karena batas memori 1 GB. Saya menangani masalah ini dalam dua tahap: streaming data untuk menekan penggunaan memori, kemudian memindahkan proses ke Redis queue dengan worker terpisah.

BOQ Tracker merupakan bagian dari sistem ERP/PO internal untuk mengelola data BOQ, IRR, payment, dan purchase order. Salah satu masalah utama yang saya tangani adalah proses export data dalam jumlah besar yang sebelumnya berjalan secara synchronous dan membebani resource aplikasi.
Studi Kasus
- Peran
- Full Stack Developer
- Durasi
- 2 Bulan
- Ukuran tim
- 2 orang
Overview
Sistem digunakan sekitar 100 pengguna setiap hari untuk kebutuhan operasional dan pengolahan data. Salah satu proses yang paling membebani aplikasi adalah export data dalam jumlah besar.
Export lebih dari 100.000 baris dapat menghasilkan file berukuran sekitar 5–20 MB dan membutuhkan waktu lebih dari satu menit. Karena seluruh proses berjalan di dalam request cycle, pekerjaan tersebut dapat berakhir dengan timeout atau penggunaan memori yang melewati batas resource yang tersedia.
Saya menangani masalah tersebut dengan pendekatan bertahap: terlebih dahulu mengurangi penggunaan memori saat proses export, kemudian memindahkan pekerjaan berat ke background worker agar tidak lagi bergantung pada request pengguna.
Masalah
Proses export dan import awalnya berjalan secara synchronous di dalam satu request. Untuk data di atas 100.000 baris, proses dapat berjalan lebih dari satu menit dan berisiko mengalami timeout atau dihentikan ketika penggunaan memori mencapai batas 1 GB.
Masalahnya tidak selalu terlihat pada dataset kecil. Proses terkadang berhasil dalam kondisi tertentu, tetapi semakin tidak stabil ketika jumlah data dan beban pemrosesan meningkat.
Tantangannya bukan hanya membuat export berhasil, tetapi memastikan proses tersebut tidak mengganggu pengguna lain yang sedang menggunakan aplikasi.
Solusi
Perbaikan dilakukan dalam dua tahap karena mengurangi penggunaan memori saja belum menyelesaikan seluruh masalah.
Tahap pertama berfokus pada penggunaan memori. Proses export diubah menggunakan OpenSpout dengan pemrosesan data secara bertahap, sehingga seluruh dataset tidak perlu dimuat sekaligus ke memori. Dataset hingga sekitar 30.000 baris kemudian dapat diproses secara langsung.
Tahap kedua memindahkan pekerjaan berat keluar dari request cycle menggunakan Redis queue dan worker terpisah. Proses dilengkapi retry otomatis hingga tiga kali serta halaman riwayat agar pengguna dapat melihat status export tanpa harus menunggu request selesai.
Sebelum diterapkan, pendekatan tersebut divalidasi terlebih dahulu menggunakan Minikube dengan batas resource yang menyerupai kondisi produksi.
Arsitektur
Aplikasi dibangun menggunakan CodeIgniter 3 dan PHP 7.4 sebagai backend dengan database relasional. Proses export awalnya berjalan synchronous di dalam request cycle, sehingga dataset besar membebani resource aplikasi.
Untuk mengatasi proses tersebut, export menggunakan OpenSpout dengan pemrosesan data secara bertahap, kemudian dipindahkan ke Redis Queue dengan worker terpisah agar pekerjaan berat tidak lagi berjalan di dalam request pengguna.
Mekanisme asynchronous divalidasi menggunakan Kubernetes melalui Minikube dengan batas resource yang dibuat menyerupai kondisi produksi.
Hasil
Berhasil memproses file sekitar 16 MB dengan lebih dari 100.000 baris. Export tidak lagi terhenti karena timeout seperti sebelumnya. Pengguna tetap dapat menggunakan aplikasi ketika proses export berjalan di background. Sistem digunakan sekitar 100 pengguna setiap hari untuk kebutuhan export BOQ, IRR, payment, dan purchase order.
Pelajaran
Perbaikan pertama mengajarkan bahwa mengurangi penggunaan memori belum tentu menyelesaikan masalah. Streaming membuat proses lebih efisien, tetapi pekerjaan yang berat tetap memiliki batas ketika dijalankan di dalam request cycle. Memindahkannya ke background worker menjadi solusi yang lebih tepat karena proses tidak lagi bergantung pada satu request pengguna.
Saya juga belajar pentingnya menguji mekanisme asynchronous dengan resource constraint yang realistis. Queue yang berjalan baik di laptop belum tentu berperilaku sama ketika memory dan resource dibatasi.