Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Hiểu Application Server Trong Ruby: Tại Sao Puma Quan Trọng

Cái "Puma" này là gì mà chạy khi bạn làm rails server? Nó là app server! Để tôi giải thích application server là gì & tại sao cần chúng với ví dụ.

Hiểu App Server

Giả sử bạn bắt đầu xây dựng web app mới bằng Ruby. Trước khi viết code... Bạn muốn thấy nó load trên trình duyệt, dù chỉ trang "welcome" mặc định. Mở trình duyệt, trỏ đến localhost:3000, hoặc localhost:4567 nếu dùng Sinatra.

Điều gì xảy ra? Trình duyệt kết nối localhost, cổng 3000, nơi app server Ruby như Puma đang chờ.

localhost trỏ đến IP đặc biệt 127.0.0.1, luôn tham chiếu máy tính của bạn

Bây giờ: Việc của Puma, hoặc rack-based server khác (Thin / Unicorn), là xử lý request trình duyệt & chuyển tiếp đến app qua interface chung. Interface nào? Rack. Tôi giải thích Rack chi tiết ở bài khác. Quay lại Puma.

Tại sao dùng app server, thay vì để Rails xử lý request trực tiếp? Câu hỏi hay. Chúng ta làm vậy vì cho phép nguyên tắc thiết kế phần mềm cơ bản: Separation of concerns (Tách biệt mối quan tâm)!

Hiểu Separation of Concerns

Việc của Rails và app của bạn là phục vụ request user. Ví dụ: Tạo tài khoản mới, kiểm tra đăng nhập, hiển thị trang sản phẩm... Bất cứ điều gì app làm.

  • Rails cung cấp menu việc user có thể làm, nhưng cũng là đầu bếp, nó làm việc
  • Puma là nhân viên phục vụ, nhận order & chuyển đến bếp
Thiết lập này cho phép mỗi người làm tốt nhất. Không chỉ vậy... Nó cũng cho phép bạn thay chef thành Sinatra, hoặc waiter thành Thin! Tùy tình huống & sở thích.

"Khi mối quan tâm được tách biệt tốt, có độ tự do cao hơn cho tái sử dụng module cũng như phát triển và nâng cấp độc lập."
Wikipedia

Application Server vs Web Server (Nginx & Apache)

Bạn có thể thắc mắc... Web server như Apache hoặc Nginx khác Ruby server như thế nào? Tại sao không dùng hai server này? Có sự khác biệt lớn. Nginx là web server chung, xử lý request & nếu có file khớp request sẽ trả file đó. Nhưng Nginx không biết gì về Rack, hoặc Ruby. Đó là lý do cần Puma hoặc Rack-compatible server khác. Tuy nhiên... Dùng Nginx trong production vẫn hữu ích. Nginx xử lý kết nối hiệu quả hơn & phục vụ static asset (css, js) mà không forward request đến app.

Hiểu Puma

Bây giờ hiểu app server là gì & tại sao hữu ích. Ta xem Puma bản thân. Tại sao chọn Puma thay server khác? Thứ nhất: Nó là server khuyến nghị của Heroku. Lý do chính: nếu dùng Unicorn - server thay thế - bạn dễ bị tấn công slow client. Cũng: Puma đa luồng (multi-threaded), thường dẫn đến ít dùng memory hơn.

"Hệ điều hành làm ít việc hơn cho chương trình đa luồng so với đa tiến trình. Điều này chuyển hóa thành hiệu năng tăng cho chương trình đa luồng."
PThreads Programming

Server Nào Nhanh Hơn?

Chạy Rack app đơn giản với lệnh:

 rackup -s thin rack-simple.ru 2>1 &>/dev/null 
Test với:
 wrk -d 20 https://localhost:9292 
Kết quả benchmark:
  • Webrick 229.97 request/giây
  • Thin 773.20 request/giây
  • Puma 2035.34 request/giây
Trong ba cái này, Puma cho hiệu năng tốt nhất. Nhưng không quan trọng nếu bạn có slow SQL query, hoặc lặp qua mảng triệu phần tử mỗi request.

Tóm Tắt

Bạn đã học về application server trong Ruby, như Puma & Thin, nên hiểu rõ hơn tại sao dùng chúng. Hiểu Application Server Trong Ruby: Tại Sao Puma Quan Trọng Bạn sẽ dùng server nào cho dự án tiếp theo? Cảm ơn bạn đã đọc! 🙂