Aplikasi Ruby on Rails yang lambat bisa membuat pengguna frustrasi dan meninggalkan situsmu. Ada banyak cara untuk memperbaiki performa tanpa menulis ulang seluruh kode. Sembilan tips berikut bisa langsung kamu terapkan, mulai dari yang paling sederhana hingga yang butuh usaha lebih.
1. Optimalkan Query Database dengan Eager Loading
Query database sering menjadi penyebab utama aplikasi Rails terasa lambat. Saat kamu mengakses relasi antar model, Rails secara default menjalankan query terpisah untuk setiap asosiasi. Ini disebut N+1 query problem. Gunakan eager loading dengan metode includes, preload, atau eager_load.
Misalnya, model Post memiliki banyak Comment. Jika ingin menampilkan daftar post beserta komentarnya, jangan lakukan ini:
posts = Post.all
posts.each do |post|
puts post.comments.count
end
Gunakan includes sebagai gantinya:
posts = Post.includes(:comments)
posts.each do |post|
puts post.comments.size
end
Dengan begitu, Rails hanya menjalankan dua query: satu untuk posts dan satu untuk comments. Jika kamu sering berurusan dengan pencarian dan filter data, teknik serupa juga berlaku di bahasa lain seperti yang dibahas dalam cara membuat kolom pencarian PHP dan filter data, di mana efisiensi query jadi penentu.
2. Manfaatkan Caching untuk Data yang Sering Diakses
Caching menyimpan hasil perhitungan atau query yang mahal sehingga permintaan berikutnya bisa dilayani lebih cepat. Rails menyediakan beberapa jenis caching: page caching, action caching, fragment caching, dan Russian doll caching. Untuk sebagian besar aplikasi, fragment caching sudah cukup membantu.
Contoh sederhana, bungkus partial dengan blok cache:
<% cache @post do %>
<%= render @post %>
<% end %>
Atur cache store yang sesuai di environment produksi, misalnya Redis atau Memcached. Bersihkan cache saat ada perubahan data agar pengguna tidak melihat konten lama.
3. Gunakan Indeks Database dengan Bijak
Indeks mempercepat pencarian data, tetapi memperlambat operasi tulis (insert, update, delete) karena indeks harus diperbarui. Tambahkan indeks pada kolom yang sering digunakan di klausa WHERE, JOIN, atau ORDER BY. Periksa query yang lambat dengan EXPLAIN di database.
Di Rails, kamu bisa menambahkan indeks melalui migrasi:
add_index :users, :email, unique: true
Hindari menambahkan indeks pada kolom yang jarang dipakai atau memiliki nilai unik rendah seperti jenis kelamin.
4. Kurangi Penggunaan Callback yang Berat
Callback seperti after_save atau before_create memudahkan pekerjaan, tetapi jika di dalamnya ada operasi berat seperti mengirim email atau memanggil API eksternal, proses penyimpanan data bisa lambat. Pindahkan tugas tersebut ke background job menggunakan Active Job dengan backend seperti Sidekiq atau Delayed Job.
Untuk memahami lebih dalam tentang callback dan kapan sebaiknya dihindari, baca panduan callback Ruby on Rails untuk pemula.
5. Optimalkan Aset Statis
Aset seperti gambar, CSS, dan JavaScript yang tidak dikompresi memperlambat waktu muat halaman. Rails menyediakan asset pipeline yang bisa melakukan minifikasi dan fingerprinting. Aktifkan kompresi di server web (misalnya gzip) dan gunakan CDN untuk menyajikan aset.
Untuk gambar, pertimbangkan format modern seperti WebP dan lazy loading. Atur header cache yang tepat agar browser tidak perlu mengunduh ulang aset yang sama.
6. Gunakan Background Job untuk Tugas Berat
Tugas seperti mengirim email, memproses gambar, atau menghasilkan laporan sebaiknya tidak dilakukan di request cycle. Dengan memindahkannya ke background job, response time ke pengguna menjadi lebih cepat. Rails memiliki Active Job yang bisa diintegrasikan dengan berbagai queue backend.
Pilih backend yang sesuai dengan skala aplikasimu. Sidekiq cocok untuk aplikasi dengan volume job tinggi karena menggunakan Redis dan mendukung multi-threading.
7. Pantau Performa dengan Alat Profiling
Sebelum melakukan optimasi, ukur dulu di mana letak masalahnya. Gunakan gem seperti rack-mini-profiler, bullet, atau New Relic untuk mengidentifikasi query lambat, N+1, dan bagian kode yang memakan waktu. bullet berguna untuk mendeteksi N+1 query secara otomatis.
Dengan data yang akurat, kamu bisa fokus pada perbaikan yang memberikan dampak terbesar.
8. Kurangi Jumlah Permintaan HTTP
Setiap permintaan HTTP menambah latensi. Gabungkan file CSS dan JavaScript, gunakan sprite untuk ikon, dan manfaatkan teknik seperti turbolinks (sekarang menjadi Hotwire Turbo) untuk navigasi antar halaman tanpa full reload. Hotwire juga mengurangi jumlah JavaScript yang perlu ditulis.
Jika kamu menggunakan jQuery, pastikan event handler tidak memicu permintaan yang tidak perlu. Pelajari lebih lanjut tentang event jQuery click, change, dan submit untuk mengelola interaksi pengguna dengan efisien.
9. Terapkan Praktik Ngoding yang Rapi
Kode yang rapi dan terstruktur lebih mudah dioptimasi. Hindari query berlebihan di view, gunakan scope untuk query yang sering dipakai, dan terapkan prinsip DRY. Kebiasaan ngoding yang baik juga mempermudah proses debugging dan profiling.
Untuk membangun kebiasaan tersebut, simak 7 kebiasaan ngoding Ruby on Rails yang bikin kode rapi. Jika kamu baru memulai, mulailah dari hal kecil seperti CRUD pertama di Rails.
Ringkasan
Meningkatkan performa aplikasi Ruby on Rails tidak selalu memerlukan perubahan besar. Mulai dari optimasi query, caching, hingga penggunaan background job, setiap langkah kecil bisa memberikan dampak nyata. Ukur dulu, perbaiki yang paling berdampak, lalu ulangi. Setelah ngoding, kamu bisa menonton pertandingan basket, sepakbola, atau UFC secara gratis bareng host kocak di tarkamlive.com.
Pertanyaan yang Sering Diajukan
Apakah caching selalu meningkatkan performa?
Caching bisa sangat membantu, tetapi jika tidak dikelola dengan baik justru bisa menyebabkan data tidak konsisten. Pastikan strategi cache invalidation tepat dan pantau penggunaan memori.
Kapan sebaiknya menggunakan background job?
Gunakan background job untuk tugas yang memakan waktu lebih dari beberapa ratus milidetik, seperti mengirim email, memproses gambar, atau memanggil API eksternal. Tugas-tugas ini sebaiknya tidak memblokir response ke pengguna.
Bagaimana cara menemukan query yang lambat?
Gunakan gem seperti bullet atau rack-mini-profiler untuk mendeteksi N+1 query dan query yang memakan waktu. Kamu juga bisa menganalisis log production atau menggunakan alat monitoring seperti New Relic.
