Cela dépend de ce que vous essayez d'éviter.
Si vous essayez d'éviter toute interruption de service de quelque chose qui est un service véritablement critique (je pense en termes de "personnes mourront si mon appel API n'est pas correctement servi"), vous devez simplement budgétiser les énormes inefficacités qui proviennent largement de la mise à disposition de ressources dédiées. Et oui, ils doivent être dédiés, rien de tout cela ne permettant des pics de trafic, plusieurs pics de services entraîneraient donc une panne.
Dans le scénario beaucoup plus probable où votre service serait en panne, il serait gênant de pouvoir résoudre le problème à la fois côté client et côté serveur. Bien qu'il soit intéressant de noter qu'il est logiquement impossible de résoudre réellement le problème de trop de trafic car sans traiter le trafic (qui consomme des ressources), vous ne pouvez pas savoir s'il s'agit d'une nouvelle tentative, s'il s'agit d'une nouvelle tentative pour une demande qui a réussi mais qui n'a pas été traitée correctement. par le client, s'il s'agit d'un DDOS, etc. Mais vous pouvez atténuer l'impact.
Dans le code client, écrivez une logique de nouvelle tentative sensible qui a une limite supérieure et un mécanisme d'échec gracieux. De cette façon, vous ne collez pas vos utilisateurs dans une boucle infinie de demandes qui échouent et vous leur donnez simplement une erreur leur disant d'essayer tout ce qu'ils viennent de faire en peu de temps.
Pour votre infrastructure côté serveur, la solution la plus simple consiste à limiter. Limites strictes sur les demandes, surtout si vous pouvez essayer de les répartir logiquement en fonction de votre cas d'utilisation spécifique (par exemple. Si vous avez un service centralisé, prenez des décisions difficiles, voulez-vous commencer à bloquer les demandes géographiquement distantes qui pourraient entraîner le blocage des threads côté serveur? Ou voulez-vous répartir uniformément votre panne inévitable mais mineure? etc.) Cela revient essentiellement au fait que le retour intentionnel d'un 503 à partir d'une passerelle est beaucoup moins cher que de laisser la demande passer et d'envoyer un 504 en tous cas. Forcez les clients à se comporter en fonction de ce que vous pouvez actuellement fournir et fournissez les bonnes réponses afin que les clients puissent réagir de manière appropriée.