Chúng tôi nhận thấy rằng các dịch vụ phụ trợ ECS Fargate của chúng tôi khởi động lại do hết thời gian chờ phản hồi kiểm tra tình trạng:
(dịch vụ our-site-com-stack-BackendApiServiceStack...) (cổng 8000) không tốt trong (nhóm mục tiêu arn:aws:elasticloadbalancing:us-east-1:1234:targetgroup/dev-d-ABC-ABC123/ ABC123) do (lý do Yêu cầu đã hết thời gian chờ).
Chúng tôi đang cố gắng tìm ra cách tiến hành health_check trên ứng dụng của chúng tôi cho ECS mà không cần phải khởi động lại dịch vụ của chúng tôi bất cứ khi nào cơ sở dữ liệu bận (hoặc các yêu cầu chậm khác đang chờ xử lý).
Ban đầu, chúng tôi cảm thấy tình huống có thể tương tự như tình huống được mô tả ở đây: https://cloudsoft.io/blog/conequences-of-bad-health-checks-in-aws-application-load-balancer. Về cơ bản, nếu cơ sở dữ liệu của chúng tôi bận/chậm, thì yêu cầu có thể hết thời gian chờ.
Tuy nhiên, chúng tôi đã sửa đổi health_check để không đánh vào cơ sở dữ liệu RDS postgres của chúng tôi và thậm chí đã thử tắt cơ sở dữ liệu của chúng tôi.Chúng tôi có thể tiếp cận điểm cuối ngay cả khi tắt cơ sở dữ liệu nhưng chúng tôi không thể tiếp cận điểm cuối khi chúng tôi kích hoạt ít nhất 7 yêu cầu sẽ hết thời gian chờ (chẳng hạn như yêu cầu đăng nhập khi cơ sở dữ liệu ngừng hoạt động) hoặc một số lượng yêu cầu tương tự sẽ bị chậm để trở lại (với cơ sở dữ liệu lên).
Trong Ngăn xếp ứng dụng AWS của chúng tôi, Tuyến 53 được sử dụng để định tuyến lưu lượng đến bản phân phối CloudFront của chúng tôi. CloudFront định tuyến lưu lượng truy cập cho điểm cuối này tới Cân bằng tải ứng dụng của chúng tôi cho ứng dụng Django.
Kiểm tra sức khỏe của chúng tôi là một phần của ứng dụng Django của chúng tôi và về cơ bản chỉ trả về 200 phản hồi:
def health_check(yêu cầu):
phản hồi = JsonResponse({"nội dung": "OK"})
phản hồi trở lại
Đây là cách kiểm tra sức khỏe của chúng tôi được thiết lập trong CDK:
self.https_listener = self.alb.add_listener(
"HTTPSListener",
cổng = 443,
chứng chỉ = [phạm vi.chứng chỉ],
mở = Đúng,
)
phạm vi.https_listener.add_target(
"Mục tiêu phụ trợ",
cổng = 80,
target=[self.backend_service],
ưu tiên = 2,
đường_mẫu=["*"],
health_check=elbv2.HealthCheck(
Healthy_http_codes="200-299",
đường dẫn = "/api/core/kiểm tra sức khỏe /",
),
)
Lệnh khởi động máy chủ sản xuất của chúng tôi là:
GEVENT_RESOLVER=ares gunicorn -t 1000 -k gevent -w 4 -b 0.0.0.0:8000 backend.wsgi
Trong quá trình thử nghiệm không liên quan, chúng tôi có thể tái tạo vấn đề tương tự bằng Daphne:
daphne -b 0.0.0.0 -p 8000 phụ trợ.asgi:application