Nó phụ thuộc vào những gì bạn đang cố gắng tránh.
Nếu bạn đang cố gắng tránh bất kỳ sự can thiệp dịch vụ nào của một dịch vụ thực sự quan trọng (tôi nghĩ theo nghĩa "mọi người sẽ chết nếu cuộc gọi API của tôi không được phục vụ một cách thích hợp"), bạn chỉ cần ngân sách cho sự thiếu hiệu quả rất lớn mà đến từ rất nhiều cung cấp tài nguyên chuyên dụng. Và vâng, họ phải tận tâm, không ai trong số này cho phép tăng lưu lượng truy cập, nhiều dịch vụ tăng vọt sẽ gây ra sự cố ngừng hoạt động.
Trong trường hợp rất có thể là dịch vụ của bạn đi xuống sẽ bất tiện, bạn có thể giải quyết vấn đề cả từ phía máy khách và máy chủ. Mặc dù đáng lưu ý rằng thực sự không thể giải quyết vấn đề về lưu lượng truy cập nhiều vì không xử lý lưu lượng (tiêu tốn tài nguyên), bạn không thể biết nếu đó là thử lại, nếu thử lại yêu cầu thành công nhưng xử lý sai bởi khách hàng, nếu đó là DDOS, v.v. Nhưng bạn có thể giảm thiểu tác động.
Trong mã máy khách, hãy viết logic thử lại hợp lý có giới hạn trên và cơ chế cho sự thất bại một cách duyên dáng. Bằng cách đó, bạn không gắn bó người dùng của mình trong một vòng lặp vô hạn của các yêu cầu không thành công và bạn chỉ báo lỗi cho họ để thử bất cứ điều gì họ vừa làm trong thời gian ngắn.
Đối với cơ sở hạ tầng phía máy chủ của bạn, giải pháp đơn giản nhất là điều tiết. Giới hạn cứng đối với các yêu cầu, đặc biệt là nếu bạn có thể thử và truyền bá chúng một cách hợp lý dựa trên trường hợp sử dụng cụ thể của bạn (ví dụ: Nếu bạn có một dịch vụ tập trung đưa ra một số quyết định khó khăn, bạn có muốn bắt đầu chặn các yêu cầu xa về mặt địa lý có thể dẫn đến việc treo các luồng Phía máy chủ? Hay bạn muốn phân phối sự cố ngừng hoạt động nhỏ nhưng không thể tránh khỏi của mình một cách đồng đều? v.v.) Về cơ bản, thực tế là việc trả lại 503 một cách cố ý từ một cổng là một địa ngục rẻ hơn rất nhiều so với việc để yêu cầu đi qua và gửi 504 dù sao. Về cơ bản buộc khách hàng hành xử dựa trên những gì bạn hiện có thể cung cấp và cung cấp phản hồi chính xác để khách hàng có thể phản ứng phù hợp.