Ý chính: Phần lớn thời gian gián đoạn xuất hiện khi hệ thống đang thay đổi, không chỉ khi hệ thống thiếu máy chủ.
Thuật ngữ trong bài: Readiness: máy chủ đã sẵn sàng nhận lưu lượng; drain: ngừng nhận việc mới và hoàn tất việc đang chạy; canary: đưa phiên bản mới cho một phần nhỏ người dùng.
Bài toán thực tế
Máy chủ mới có thể nhận lưu lượng trước khi các thành phần phụ thuộc sẵn sàng. Máy chủ cũ cũng có thể bị dừng khi vẫn còn yêu cầu đang xử lý. Chỉ theo dõi CPU trung bình sẽ không phát hiện được hai rủi ro này.
Độ sẵn sàng không chỉ phụ thuộc vào số lượng máy chủ. Khi triển khai, hệ điều phối, bộ cân bằng tải và ứng dụng phải thống nhất lúc nào một tiến trình được nhận lưu lượng và lúc nào nó đã xử lý xong để có thể dừng.
Readiness quá lỏng sẽ đưa lưu lượng vào máy chưa sẵn sàng; readiness phụ thuộc quá nhiều dịch vụ bên ngoài lại có thể loại toàn bộ máy khỏe khỏi hệ thống.
Thiết kế và triển khai
- Mở rộng dựa trên mức bão hòa, độ trễ P99 và tuổi hàng đợi thay vì chỉ một chỉ số trung bình.
- Giữ liveness đơn giản; dùng readiness để quyết định một tiến trình có được nhận lưu lượng hay không.
- Khi dừng, ngừng nhận lưu lượng mới, hoàn tất các yêu cầu đang xử lý rồi mới đóng kết nối phụ thuộc.
Mã minh họa: Máy trạng thái khi dừng ứng dụng
RUNNING --SIGTERM--> DRAINING
DRAINING: readiness = false
DRAINING: ngừng nhận queue job mới
DRAINING: chờ loadBalancerPropagation
DRAINING: await inFlightRequests == 0
DRAINING: đóng database và broker pool
DRAINING --deadline--> TERMINATED
terminationGrace >= propagation + maxRequest + cleanupThời hạn dừng phải dài hơn phần lớn yêu cầu hợp lệ nhưng vẫn hữu hạn để một yêu cầu kẹt không giữ tiến trình mãi mãi.
Rủi ro cần tính trước
- Readiness báo sẵn sàng trước khi cấu hình, migration hoặc nhóm kết nối bắt buộc đã hoàn tất.
- Bộ cân bằng tải tiếp tục gửi lưu lượng trong một khoảng thời gian sau khi readiness đổi.
- Tự động mở rộng và cập nhật cuốn chiếu cùng lúc rút bớt quá nhiều năng lực.
Nên theo dõi gì?
| Tín hiệu | Điều tín hiệu cho biết |
|---|---|
| Tỷ lệ thành công phía người dùng và P99 | Bản phát hành chỉ khỏe khi yêu cầu thật vẫn thành công trong mục tiêu độ trễ. |
| Số tiến trình đang khởi động, sẵn sàng và đang drain | Cho thấy rõ từng trạng thái vòng đời thay vì coi mọi tiến trình đang chạy là năng lực dùng được. |
| Số yêu cầu còn xử lý lúc tiến trình bị dừng | Mọi lần buộc dừng với giá trị lớn hơn 0 đều cho thấy thời gian drain chưa đủ. |
| Tốc độ tiêu hao ngân sách lỗi khi triển khai | Cho phép tự động tạm dừng hoặc quay lui trước khi lỗi lan ra toàn bộ hệ thống. |
Đưa vào production từng bước
Đo thời gian khởi động, thời gian bộ cân bằng tải cập nhật và thời lượng của yêu cầu dài nhất trước khi đổi hành vi dừng tiến trình. Sau đó bật drain trên một nhóm nhỏ, kiểm tra các lần buộc dừng và chỉ tự động quay lui khi cảnh báo theo SLO đã đủ đáng tin.
Điều cần nhớ
Triển khai không gián đoạn là quản lý trọn vòng đời lưu lượng: chuẩn bị, nhận việc, ngừng nhận việc mới, hoàn tất việc đang chạy rồi mới kết thúc tiến trình.
