Câu 1Giữa server chạy thường trực và serverless, thời gian chương trình xử lý đang chạy khác nhau thế nào?
Khác nhau giữa server, serverless và container — tầng App
Bài viết này nằm trong khóa Kiến thức nền tảng về CNTT, xây dựng từ đầu những kiến thức CNTT thực tế tối thiểu mà bạn cần để lập trình và vibe coding.
Khác biệt nằm ở thời gian mà chương trình xử lý đang chạy. Các sơ đồ giúp bạn phân biệt hình thức chạy sẵn rồi chờ, hình thức chỉ chạy khi có request, và container — thứ chạy kèm cả môi trường chạy trên 1 OS.
Bài viết này nói về 3 hình thức chạy tầng App.
Đó là chạy thường trực, tức để nguyên 1 server đang chạy; serverless, chỉ chạy khi có request tới; và container.
Khác biệt nằm ở thời gian mà chương trình xử lý đang chạy.
Vì thời gian chạy khác nhau nên cách tăng số lượng khi request nhiều lên, và những thứ bạn phải tự chuẩn bị, cũng khác nhau.
Server chạy thường trực luôn chạy và chờ nhận request
Bạn không biết request tới lúc nào, nên bạn chạy server.js trước và để nó chờ ở đó dưới dạng một tiến trình (process, một chương trình đã khởi động và đang chạy).
Hình thức để nguyên tiến trình đó thay vì kết thúc nó là chạy thường trực (always-on, giữ chương trình ở trạng thái đang chạy để lúc nào cũng nhận được request).
Server listening on port 3000
Press Ctrl+C to stop
Dòng thứ 1 cho thấy trạng thái đang lắng nghe request ở cổng đã chọn.
Đúng như dòng thứ 2, tiến trình không kết thúc cho tới khi bạn thao tác dừng nó.
| Thứ tới vào thời điểm đó | Tiến trình server.js | Nội dung trả về tầng Web server |
|---|---|---|
| 9:00 thao tác khởi động | Khởi động và bắt đầu lắng nghe | Chưa trả về gì |
| 9:05 request /reservations | Nhận luôn và tra cứu các lượt đặt chỗ | 3 lượt đặt chỗ |
| 9:06 không có gì tới | Không kết thúc, tiếp tục chờ | Không trả về gì |
- Lắng nghe request ở cổng 3000
- Không kết thúc cho tới khi bạn thao tác dừng
- Chứa phần xử lý cho request tới /reservations
- Hỏi tầng DB số lượt đặt chỗ
- node thì bạn cài từ trang chính thức
- Bản cập nhật OS cũng do bạn tự làm
Thứ bạn tự chuẩn bị không chỉ có server.js ở trong cùng.
Máy tính giữ cho chạy liên tục, OS trên đó và node cũng do bạn tự chuẩn bị.
Đây chính là khác biệt lớn so với serverless sẽ xem tiếp theo.
Bên trong khung là 1 máy do bạn tự chuẩn bị và giữ cho chạy liên tục.
Tiến trình không kết thúc kể cả trong lúc không có request tới; nó mở sẵn cổng và chờ.
Chạy thường trực nghĩa là chạy mãi cho tới khi bạn dừng
Server chạy thường trực là hình thức bạn chạy trước rồi để nó chờ request tới.
Thứ khởi động nó là node server.js, tiến trình không kết thúc cho tới khi bạn thao tác dừng, còn máy tính giữ cho chạy liên tục, OS và node đều do bạn tự chuẩn bị.
Serverless chỉ chạy phần xử lý khi có request tới
Với serverless (hình thức mà chương trình xử lý chỉ chạy khi có request tới và dừng khi xử lý xong), bạn không tự chạy một tiến trình đứng chờ.
Thứ bạn đăng ký là 1 file duy nhất như handler.js, và đơn vị đăng ký đó được gọi là "hàm".
- Nhận các request tới
- Quyết định số lượng chạy đồng thời
- OS và node do nhà cung cấp chuẩn bị
- Dừng khi xử lý xong
- Chỉ xử lý 1 lượt request tới /reservations
- Thời gian chạy được có giới hạn trên
Thứ bạn động tới chỉ là handler.js ở trong cùng.
Các khung bên ngoài do nhà cung cấp chuẩn bị, việc cập nhật OS và node cũng do họ làm.
Ai chuẩn bị tới đâu thì bài "On-premises, server cho thuê, cloud" sẽ nói tới.
Trong lúc chưa có request tới, handler.js không chạy.
Môi trường chạy được chuẩn bị theo từng request và dừng lại khi trả lời xong.
Đây là khác biệt so với chạy thường trực, vốn chạy mãi cho tới khi bạn dừng.
Serverless chỉ chạy khi được gọi
Serverless là hình thức chạy phần xử lý sau khi request tới, rồi dừng khi trả lời xong.
Thứ bạn đặt vào chỉ là handler.js, còn môi trường chạy nó thì nhà cung cấp chuẩn bị cho mỗi request.
Cách tăng số lượng khi request đồng thời nhiều lên là khác nhau
Số request tới cùng lúc thay đổi theo khung giờ.
Việc điều chỉnh theo đó là scaling (tăng hoặc giảm số lượng bên xử lý cho khớp với lượng request).
Hãy bắt đầu từ trường hợp 3 request tới serverless cùng lúc.
Cho tới số lượng chạy đồng thời mà nhà cung cấp đã định, không request nào phải chờ.
Bạn cũng không tự thao tác để tăng số lượng.
Server chạy thường trực cũng cần những vai trò đó, nhưng bên đảm nhiệm thì khác.
Thứ thay đổi là bạn tự quyết định việc tăng, hay giao cho hệ thống của nhà cung cấp.
Sau khi tăng lên thì request của cùng một người chưa chắc lần nào cũng tới đúng một bên, nên cần stateless (một lượt xử lý không giữ giá trị đã nhớ ở lượt xử lý trước).
Việc lượt thứ 2 có đọc được giá trị đã nhớ ở lượt thứ 1 hay không phụ thuộc vào chỗ bạn đặt giá trị đó.
Giá trị mà request kế tiếp cũng dùng thì hãy lưu vào tầng DB rồi đọc ra từ đó.
Server chạy thường trực cũng vậy: khi bạn tăng số tiến trình, giá trị không còn lại ở các tiến trình khác.
Cách tăng số lượng, và chỗ đặt giá trị
Khi request đồng thời nhiều lên, ở chạy thường trực bạn tự tăng số lượng, còn ở serverless thì hệ thống của nhà cung cấp tăng giúp.
Sau khi tăng lên, 2 request của cùng một người chưa chắc do cùng một bên trả lời, nên giá trị bạn còn muốn dùng tiếp thì lưu vào tầng DB chứ không phải bộ nhớ tại chỗ.
Container chạy trên 1 OS, và bạn chọn trong 3 hình thức theo việc có cần chạy thường trực hay không
Hình thức thứ 3, container (định dạng gói ứng dụng, môi trường chạy và các file cần thiết vào làm một, rồi chạy trên máy tính khác vẫn giữ nguyên cấu hình đó), có thời gian đang chạy giống server chạy thường trực.
Chỗ khác là môi trường chạy không được cài vào máy tính mà được gói chung với ứng dụng.
- 3 máy tính
- 3 OS
- Cài Node.js 18 / Python 3.11 / Node.js 20 lên các máy riêng
- 1 tiến trình
- Node.js 18
- server.js
- 1 tiến trình
- Python 3.11
- batch.py
- 1 tiến trình
- Node.js 20
- admin.js
OS chỉ có 1, và mỗi container chạy trên đó như 1 tiến trình.
Môi trường chạy nằm riêng bên trong từng container, nên container bên cạnh dùng gì cũng không ảnh hưởng.
Phần thiết bị dùng để chạy, như CPU và bộ nhớ, là tài nguyên (resource).
Phía trên chạy 3 OS, còn phía dưới chia nhau 1 OS, nên cùng một thiết bị chứa được nhiều ứng dụng hơn.
Cùng số máy mà chạy được nhiều hơn, chi phí giữ cho chạy liên tục cũng ít hơn.
Vì không khởi động OS mới nên thời gian tới lúc bắt đầu chạy cũng ngắn hơn.
1 OS chỉ cài được 1 node, nhưng với container thì 2 bên vẫn giữ node riêng và chạy song song.
Vì môi trường chạy tách theo từng ứng dụng nên nâng phiên bản một bên thì bên kia vẫn chạy.
Bộ file đã gói lại là container image (gói ứng dụng, môi trường chạy và các file cần thiết vào làm một), và phần mềm tiêu biểu để tạo rồi chạy nó là Docker.
Bên chạy chỉ việc nhận image này rồi khởi động.
Dù nơi chạy có thay đổi, thứ được khởi động vẫn là cùng 1 image.
Vì không cần cài lại môi trường chạy trên server công khai nên bạn công khai được đúng cấu hình đã chạy ở máy mình.
Ranh giới khi chọn là có cần chạy cả trong lúc không có request hay không.
Ranh giới còn lại là 1 thiết bị chứa được bao nhiêu.
Ở 2 nhánh trên, tiến trình vẫn chạy cả trong lúc không có request.
2 nhánh đó tách nhau ở chỗ cài môi trường chạy vào máy tính, hay gói cả môi trường chạy vào làm một.
2 hình thức chạy thường trực phải chạy suốt cả phần thời gian không có request.
Với serverless, thứ được đếm chỉ là thời gian đã chạy và số lần được gọi.
Khi request còn thưa, khác biệt này hiện ra ngay.
Chọn theo thời gian đang chạy
Trước hết chia làm 2 theo việc có cần chạy cả trong lúc không có request hay không.
Nếu không cần thì chọn serverless, nếu cần thì chọn server chạy thường trực hoặc container.
Container chia 1 OS giữa các ứng dụng nên bạn xếp được nhiều ứng dụng lên cùng thiết bị và giảm được chi phí giữ cho chạy liên tục.
Khi muốn cấu hình ở máy mình và ở nơi công khai giống nhau, bạn cũng chọn container.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Bạn dùng container trong trường hợp nào?
Câu 3Khi muốn dùng lại ở request kế tiếp một giá trị đã đặt vào bộ nhớ giữa chừng phần xử lý, bạn làm gì?