7 Mẹo Tối Ưu Hiệu Suất Ứng Dụng Ruby on Rails
Rails là một framework mạnh mẽ nhưng nếu không tối ưu đúng cách, ứng dụng của chúng ta sẽ dễ bị chậm hoặc tốn tài nguyên không cần thiết. Dưới đây là 7 mẹo giúp cải thiện hiệu suất khi làm việc với Ruby on Rails.
1. Tránh N+1 Query bằng Eager Loading
Rails có thể tự động gọi thêm nhiều truy vấn nếu chúng ta không load dữ liệu liên quan đúng cách:
# Bad: mỗi comment gọi riêng 1 query cho post
Comment.all.each do |c|
puts c.post.title
end
# Good: eager load bằng includes
Comment.includes(:post).each do |c|
puts c.post.title
end
👉 Sử dụng includes, preload hoặc eager_load khi cần lấy dữ liệu liên kết.
2. Cache Fragment để giảm render view
Sử dụng cache trong view giúp Rails không phải render lại đoạn HTML nếu dữ liệu không đổi.
<% cache @post do %>
<%= render @post %>
<% end %>
👉 Kết hợp với touch: true
trong model để cache tự cập nhật khi dữ liệu thay đổi.
3. Sử dụng select
để tránh tải dữ liệu không cần thiết
Không nên gọi Model.all
nếu chỉ cần vài cột.
# Bad
User.all
# Good
User.select(:id, :email).where(active: true)
👉 Giảm thời gian truy vấn và dung lượng RAM tiêu tốn.
4. Dùng find_each
để xử lý dữ liệu lớn
Khi lặp qua hàng ngàn bản ghi, hãy dùng find_each
thay vì each
:
# Good
User.find_each do |user|
user.send_newsletter
end
👉 Rails sẽ chia nhỏ bản ghi thành từng batch
(mặc định 1000), giúp tiết kiệm RAM.
5. Ghi log hiệu quả – tránh spam log
Rails log mặc định khá nhiều. Hãy giảm noise và format lại cho dễ đọc:
# config/environments/production.rb
config.log_level = :info
👉 Có thể dùng gem như lograge để gọn gàng hơn.
6. Dùng Bullet Gem để bắt lỗi N+1
Cài gem bullet
trong môi trường phát triển để tự động phát hiện và cảnh báo N+1 query:
# Gemfile
group :development do
gem 'bullet'
end
👉 Hiển thị popup hoặc log lỗi khi query chưa tối ưu.
7. Redis + Sidekiq cho xử lý nền
Các tác vụ tốn thời gian như gửi email, tạo báo cáo nên được chuyển sang background job:
# jobs/example_job.rb
class ExampleJob < ApplicationJob
queue_as :default
def perform(user_id)
UserMailer.welcome_email(User.find(user_id)).deliver_now
end
end
👉 Sidekiq kết hợp Redis giúp xử lý hàng ngàn job nhanh và ổn định.
Kết luận
Tối ưu hiệu suất trong Rails không quá phức tạp, chỉ cần áp dụng một số thói quen tốt khi truy vấn, ghi log, cache và xử lý nền. Những mẹo trên là nền tảng để ứng dụng của chúng ta hoạt động mượt mà hơn trong thực tế.
Có tips nào bạn hay dùng mà chưa được nhắc tới? Hãy chia sẻ dưới phần bình luận nhé!
All rights reserved