+1

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí