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ờ.
localhosttrỏ đến IP đặc biệt127.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
"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/nullTest với:
wrk -d 20 https://localhost:9292Kết quả benchmark:
- Webrick 229.97 request/giây
- Thin 773.20 request/giây
- Puma 2035.34 request/giây
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.
Bạn sẽ dùng server nào cho dự án tiếp theo? Cảm ơn bạn đã đọc! 🙂