18.3.2 Kích hoạt tắt ứng dụng một cách nhẹ nhàng (graceful shutdown)
Chúng ta có một số cách để làm cho ứng dụng Spring thân thiện với Kubernetes, nhưng hai điều quan trọng nhất bạn cần làm là: kích hoạt tắt ứng dụng nhẹ nhàng (graceful shutdown) và thiết lập các probe kiểm tra trạng thái sống (liveness) và sẵn sàng (readiness).
Vào bất kỳ thời điểm nào, Kubernetes có thể quyết định tắt một hoặc nhiều pod mà ứng dụng của bạn đang chạy. Điều này có thể xảy ra do hệ thống phát hiện sự cố, hoặc do có người yêu cầu tắt hoặc khởi động lại pod. Dù lý do là gì, nếu ứng dụng trên pod đang xử lý một yêu cầu mà bị tắt ngay lập tức thì sẽ là một hành vi không tốt, vì yêu cầu đó sẽ không được xử lý xong. Điều này dẫn đến việc phản hồi lỗi về phía client và buộc client phải gửi lại yêu cầu.
Thay vì khiến client phải xử lý lỗi, bạn có thể kích hoạt chế độ tắt nhẹ nhàng trong ứng dụng Spring bằng cách thiết lập thuộc tính server.shutdown thành "graceful". Việc này có thể thực hiện trong bất kỳ nguồn cấu hình nào đã được đề cập ở chương 6, ví dụ trong tệp application.yml như sau:
server:
shutdown: gracefulKhi kích hoạt chế độ tắt nhẹ nhàng, Spring sẽ trì hoãn việc tắt ứng dụng tối đa 30 giây, cho phép các yêu cầu đang xử lý được hoàn tất. Sau khi tất cả các yêu cầu đang chờ được xử lý xong hoặc thời gian chờ tắt ứng dụng hết hạn, ứng dụng sẽ được phép tắt.
Thời gian chờ khi tắt (shutdown timeout) mặc định là 30 giây, nhưng bạn có thể thay đổi bằng cách thiết lập thuộc tính spring.lifecycle.timeout-per-shutdown-phase. Ví dụ, để thay đổi thành 20 giây, bạn có thể cấu hình như sau:
spring:
lifecycle.timeout-per-shutdown-phase: 20sTrong thời gian chờ tắt ứng dụng, server nhúng (embedded server) sẽ ngừng chấp nhận các yêu cầu mới. Điều này cho phép tất cả các yêu cầu đang xử lý được hoàn thành trước khi tắt hoàn toàn.
Tuy nhiên, tắt ứng dụng không phải là thời điểm duy nhất mà ứng dụng có thể không xử lý được yêu cầu. Trong quá trình khởi động, ứng dụng cũng có thể cần một khoảng thời gian để sẵn sàng tiếp nhận lưu lượng truy cập. Một trong những cách để ứng dụng Spring thông báo cho Kubernetes biết rằng nó chưa sẵn sàng xử lý lưu lượng là sử dụng readiness probe. Ở phần tiếp theo, chúng ta sẽ tìm hiểu cách kích hoạt các probe kiểm tra trạng thái sống (liveness) và sẵn sàng (readiness) trong ứng dụng Spring.
