04/10/2018, 17:48

Rails::API vs. Sinatra vs. Grape

Ai cũng biết rằng Rails thống trị trong mảng các Ruby web framework, khi mà framework phổ biến thứ hai là Sinatra cũng chỉ bằng 5% mức độ phổ biến so với Rails. Mặc dù vậy, điều đó không có nghĩa là các non-Rails frameworks như là Sinatra và Grape không có vai trò gì. Khi nào thì việc bỏ qua ...

Ai cũng biết rằng Rails thống trị trong mảng các Ruby web framework, khi mà framework phổ biến thứ hai là Sinatra cũng chỉ bằng 5% mức độ phổ biến so với Rails. Mặc dù vậy, điều đó không có nghĩa là các non-Rails frameworks như là Sinatra và Grape không có vai trò gì. Khi nào thì việc bỏ qua ActionController và sử dụng framework khác là hợp lý? Ưu điểm và khuyết điểm của chúng là gì?. Chúng ta sẽ cùng khám phá điều đó trong bài viết này.

Sinatra

Sinatra được release lần đầu năm 2007, là non-Rails web framework đầu tiên giành được sự chú ý từ cộng đồng. Bởi sự tập trung vào việc xây dựng một web app nhanh chóng, cần ít công sức nhất có thể so với cách tiếp cận nguyên khối (đầy đủ chức năng cơ bản của một web app) của Rails. Implement một Sinatra nhỏ có thể chỉ cần duy nhất một file, trái ngược với Rails app.

Grape

Grape được release cuối mùa thu năm 2010, Grape là web framework tiếp theo giành được sự chú ý đáng kể. Có thể coi Grape là một Ruby REST-like API framework. Tương tự như việc Rails giúp bạn nhanh chóng xây dựng một MVC app, bạn có thể xây dựng một REST-like API mạnh mẽ với Grape.

Rails::API

Rails::API được release vào mùa xuân năm 2012. Rails::API chỉ sử dụng một phần nhỏ của Rails stack cho app đủ để generate JSON, bỏ qua các middleware không liên quan tới API app (ví dụ: cookie, flash, và session management). Rails::API bắt đầu là một gem riêng biệt, nhưng trong lần release của Rail 5 mùa hè năm 2016, nó đã được thêm vào default của Rails.

Mỗi framework đều có các ưu điểm và có thể thay thế nhau trong nhiều ngữ cảnh sử dụng. Hãy cũng lướt qua vài câu hỏi để xác dịnh framework nào là phù hợp nhất với ngữ cảnh của bạn.

App của bạn có thể phát triển đến giai đoạn không chỉ cung cấp JSON?

Sinatra, Grape, and Rails::API đều có thể dễ dàng xuất ra JSON. Tuy nhiên, Nếu nó có thể phát triển tới mức không chỉ trả về các JSON response (ví dụ: render HTML, có thể tương tác thông qua form, cần đến session của người dùng,...) thì lúc đó sử dụng Grape lại là một rào cản vì nó chỉ tập trung chủ yếu vào JSON API.

Nếu như bạn chọn nhầm framework?

Nhờ có Rack's support cho việc mounting, bạn không phải lo lắng quá khi scope của app thay đổi và microframework bạn chọn không đáp ứng đầy đủ được. Bạn có thể dễ dàng mount Grape và Sinatra trong Rails, hoặc thậm chí là mount Grape cùng với Sinatra.

App của bạn cung cấp api công khai và được sử dụng nhiều

Khi đó bạn cần phải có thêm một số chức năng như Versioning, Documentation cho API, Parameter validation, Authentication,... Giống như Rails có các convention cho Rails app, Grape cũng có các convention cho JSON API app. Khi đã nắm bắt được các convention này, việc mở rộng API app với Grape là điều rất dễ dàng.

Đánh giá hiệu năng

alt Ta thấy được rằng Sinatra và Grape có hiệu năng vượt trội hơn so với Rails::API. Tuy nhiên cũng phải lưu ý Rails::API bao gồm một lượng lớn các middleware mà có thể bạn không dùng đến.

Điểm không rõ ràng

Sẽ có một vài thứ không cố định ảnh hưởng tới quyết định lựa chọn framework của bạn. Ví dụ như:

  • Performance - mặc dù Sinatra và Grape có vẻ tốt hơn Rails::API khá nhiều về hiệu năng, Rails::API có thể bỏ đi các middlewares không sử dụng, nhờ đó có được hiệu năng tương đương Sinatra hay Grape
  • Shared logic - nếu một service chia sẻ một vài logic với Rails (database access, ActiveRecord models, ...), bạn sẽ thường xuyên phải xử lý(tích hợp, xây dựng giải pháp thay thế) điều đó.

Điểm nổi bật

Mỗi framework có một số điểm nổi bật riêng:

  • Rails::API - Có thể coi như một Rails app đơn giản hơn, nhanh hơn, chuyên dụng cho việc cung cấp JSON API thay vì phải thông qua ActionController.
  • Sinatra - Thích hợp cho các app đã rõ ràng scope của nó từ đầu, ít phải share logic với app khác và có thể làm thêm một vài thứ hơn là chỉ cung cấp JSON API.
  • Grape - Khi app của bạn tập trung chủ yếu vào việc phát triển API, Grape là một lựa chọn tốt
0