12/08/2018, 15:22

Tăng tốc ứng dụng Rails.

Vì Ruby là ngôn ngữ thông dịch nên về tốc độ không thể sánh bằng Java hay .Net. Đặc biệt hơn với framwork Rails, tốc độ của 1 ứng dụng phụ thuộc rất nhiều yếu tố. nhất là cấu hình của máy chủ triển khai. Tuy nhiên, các đoạn mã có thể tạo ra một sự khác biệt lớn dù trang web của bạn chậm hoặc đáp ...

Vì Ruby là ngôn ngữ thông dịch nên về tốc độ không thể sánh bằng Java hay .Net. Đặc biệt hơn với framwork Rails, tốc độ của 1 ứng dụng phụ thuộc rất nhiều yếu tố. nhất là cấu hình của máy chủ triển khai. Tuy nhiên, các đoạn mã có thể tạo ra một sự khác biệt lớn dù trang web của bạn chậm hoặc đáp ứng cao.

Trong bài viết này, mình xin giới thiệu với các bạn 1 vài cách để làm tăng hiệu suất tốc độ của 1 ứng dụng Ruby on Rails

  • Caching
  • Tối ưu các câu query database
  • Tránh sử dụng các phương thức tìm động
  • Tối ưu code html trên view

Đây là cách đơn giản nhất để tăng tốc độ một ứng dụng Rails. Dưới đây là một phương thức của Caching:

Page Caching:

Rails cung cấp một cách cài đặt caches_page :index để thông báo cho webserver tự động generate trang HTML tĩnh và sử dụng cho các lần request tiếp theo từ controller User action là index. mặc định thì trang HTML này sẽ được tạo ra tại folder /public bạn cũng có thể thay đổi chúng bằng cách thay đổi config. config.action_controller.page_cache_directory=new_cache_path

Ở đoạn code trên bạn sử dụng expire_page action: index trong action create để thông báo cho webserver hủy bỏ trang tĩnh index đã lưu trên webserver khi có một record mới được tạo. điều này nghĩa là khi bạn gọi lại trang index lần sau đó thì server sẽ thực hiện nạp lại trang index vào trang HTML bà bạn sẽ nhìn thấy dữ liệu của một record đã được thêm mới

Bạn cũng có thể cấu hình cho webserver (Ngix) sẽ tự động zip lại page khi gửi trả lại phía client để tăng tốc độ truy cập bằng cách bật thuộc tính gzip_static: on trong setting server Nginx.

location / { gzip_static on; # to serve pre-gzipped version }

sau đó bạn có thể set thuộc tính gzip bằng cách caches_page :index, :gzip => :best_speed

SQL Caching:

Đây là phương pháp mình sử dụng nhiều nhất trong các ứng dụng Rails của mình.

Ví dụ:

Lần đầu tiên bạn chạy

@users = User.all

các lần tiếp theo nếu bạn chạy câu lệnh y như trên nó sẽ lấy từ Cache ra.

Tuy nhiên: Sql Caching chỉ được tạo ra khi bắt đầu 1 method và mất đi khi kết thúc method đó, vì vậy nếu muốn sử dụng cho các method khác bạn có thể sử dụng bộ Cached thấp hơn.

Và còn hàng tá cách Cache khác nhau. http://guides.rubyonrails.org/caching_with_rails.html

Đối với cái này thì có hàng đống lỗi thường mắc phải, nhưng có 1 cái quan trọng gây ra sự chậm của ứng dụng Rails. Đó là N+1 query.

Với lỗi N+1 này cách đơn giản nhất là sử dụng Eager Loading bằng cách Inludes vào đối tượng muốn truy xuất.

Các phương thức tìm động như MyModel.find_by_*mặc dù rất tiện dụng,dễ sử dụng,dễ nhớ đối với những người lập trình Ruby nhưng các phương thức này cũng là 1 nguyên nhân làm giảm hiệu suất của hệ thống,lý do là do ActiveRecord tự động sinh ra những phương thức trong hàm method_missing. Lời khuyên với các bạn là sử dụng MyModel.find_by_sql trực tiếp đôi khi sẽ tiện dụng hơn,đồng thời có thể giúp tăng tốc 1 phần khi thao tác với cơ sở dữ liệu.

Chúng ta nên chia các view thành các partial view đễ dễ dàng quản lý và cache lại. Hạn chế sử dụng các Helper sinh ra các đoạn code html, vì nó sẽ tốn 1 khoảng thời gian để biên dịch và xử lý cách method đó.

VD: Thay vì dùng text_field_tag ta nên sử dụng thẻ Html thuần. Vì thường form của ta thường ít nên khó có thể thấy được sự khác nhau. Nhưng với những ứng dụng nhiều textbox input thì đúng là cả 1 vấn đề             </div>
            
            <div class=

0