En cas d'accès simultané élevé, comme les promotions du commerce électronique, le trafic continue d'affluer et la fréquence des appels mutuels entre les services augmente soudainement, ce qui rend la charge du système trop élevée. services sur lesquels repose le système L'impact sur le système est très important et de nombreux facteurs incertains provoquent des avalanches, tels que des interruptions de connexion réseau, des temps d'arrêt de service, etc. Généralement, les composants tolérants aux pannes des microservices fournissent une limitation de courant, une isolation, une dégradation, un disjoncteur et d'autres moyens, qui peuvent protéger efficacement notre système de microservices. Cet article parle principalement de limitation de courant.
Limitation de courant signifie limiter le débit maximum pour éviter que la fréquence de fonctionnement ne dépasse la limite définie. La concurrence maximale que le système peut fournir est limitée et il y a trop de demandes en même temps, ce qui nécessite une limitation, comme des ventes flash et des promotions importantes. Lorsqu'un grand nombre de demandes affluent instantanément, le serveur ne peut pas les répondre. il doit donc y avoir une limitation. La limitation de débit protège les services contre une utilisation excessive accidentelle ou malveillante en limitant le nombre de requêtes pouvant atteindre l'API au cours d'une période de temps donnée. Sans limitation de débit, n'importe quel utilisateur peut bombarder votre serveur de requêtes, provoquant une situation où les autres utilisateurs meurent de faim.
Ensuite, nous présenterons quatre algorithmes courants de limitation de courant
L'avantage de cet algorithme est qu'il lisse la rafale de requêtes et les traite à un rythme constant. Il est également facile à mettre en œuvre sur un équilibreur de charge et est économe en mémoire pour chaque utilisateur. Maintient un trafic constant et quasi uniforme vers le serveur, quel que soit le nombre de requêtes.
L'inconvénient est qu'une explosion de demandes peut remplir le seau, conduisant à une pénurie de nouvelles demandes. Cela ne garantit pas non plus que la demande sera complétée dans un délai donné.
Avantages :
Circulation fluide.
Étant donné que l'algorithme du bucket à fuites traite les demandes à un rythme fixe, il peut efficacement lisser et façonner le trafic et éviter les rafales et les fluctuations du trafic (similaire à l'effet d'écrêtement des pics et de remplissage des vallées des files d'attente de messages).Algorithme de compartiment de jetons : En supposant que la limite est de 2r/s, les jetons sont ajoutés au compartiment à un rythme fixe de 500 millisecondes. Un maximum de b jetons peuvent être stockés dans le compartiment. Lorsque le compartiment est plein, les jetons nouvellement ajoutés sont supprimés ou rejetés. Lorsqu'un paquet de taille n octets arrive, n jetons sont supprimés du compartiment et le paquet est envoyé au réseau. S'il y a moins de n jetons dans le compartiment, le jeton ne sera pas supprimé et le paquet sera limité en débit (soit rejeté, soit mis en mémoire tampon). Le principe de limitation du courant du compartiment à jetons est tel qu'illustré sur la figure.
Le compartiment à jetons du côté du serveur de limitation actuel peut ajuster la vitesse de génération des jetons et la capacité du compartiment en fonction des performances réelles du service et de la période de temps. Lorsque le taux doit être augmenté, le taux de jetons mis dans le seau peut être augmenté sur demande.
Le taux auquel les jetons sont générés est constant, alors qu'il n'y a aucune limite sur le taux auquel les demandes peuvent être faites pour obtenir des jetons. . Cela signifie que face à un trafic important instantané, l'algorithme peut obtenir un grand nombre de jetons en peu de temps, et le processus d'obtention de jetons ne consomme pas beaucoup de ressources
Lorsque chaque nouvelle demande arrive sur le serveur , il sera exécuté Deux opérations :
L'algorithme est économe en mémoire car nous économisons moins de données par utilisateur pour notre application. Le problème ici est que cela peut conduire à des conditions de concurrence dans les environnements distribués. Cela se produit lorsque deux requêtes provenant de deux serveurs d'applications différents tentent d'obtenir le jeton en même temps.
Avantages :
Inconvénients :
permet d'entrer un certain nombre de requêtes dans une fenêtre de temps fixe. Si la quantité est dépassée, elle sera rejetée ou mise en file d'attente pour attendre la période suivante. Cette limitation à contre-courant est mise en œuvre par une limitation dans un intervalle de temps. Si l'utilisateur envoie une requête avant la fin de l'intervalle précédent (mais ne dépasse pas la limite) et envoie également une requête au début de l'intervalle en cours (ne dépasse pas non plus la limite), alors ces requêtes seront normales pour leur intervalles respectifs. Cependant, lorsque les requêtes dépassent les limites du système pendant des périodes critiques, cela peut provoquer une surcharge du système
En raison du défaut de point critique de temps de l'algorithme du compteur, il est vulnérable aux attaques dans un laps de temps très court autour du point critique de temps. Par exemple, il est configuré pour demander une certaine interface jusqu'à 100 fois par minute. Par exemple, il n'y a pas de demande de données entre 12:00:00 et 12:00:59, mais il y a une demande simultanée soudaine. la période de 12:00:59 à 12:01:00, puis en entrant dans le cycle de comptage suivant, le compteur est effacé et il y a 100 demandes entre 12:01:00 et 12:01:01. En d'autres termes, au moment critique, il peut y avoir deux fois plus de requêtes que le seuil en même temps, provoquant une surcharge de requêtes de traitement en arrière-plan, entraînant des capacités de fonctionnement insuffisantes du système, voire provoquant un crash du système.
Inconvénients :
Par exemple : la limite actuelle est de 3 par seconde, 3 requêtes sont envoyées dans la dernière milliseconde de la première seconde et 3 requêtes sont envoyées dans la première milliseconde de la deuxième seconde. Six demandes ont été traitées dans ces deux millimètres, mais la limite actuelle n'a pas été déclenchée. S'il y a une explosion de trafic, cela peut submerger le serveur.
L'algorithme de fenêtre coulissante divise une période de temps fixe et la déplace avec le temps. La méthode de mouvement consiste à ce que le point temporel de départ devienne le deuxième point temporel dans la liste de temps et le point temporel final. un point temporel et le répéter continuellement peut intelligemment éviter le problème du point critique du compteur.
L'algorithme de fenêtre glissante peut efficacement éviter le problème du point critique de temps dans l'algorithme du compteur, mais il existe toujours le concept de segments temporels. Dans le même temps, l'opération de comptage de l'algorithme à fenêtre glissante prend également plus de temps que l'algorithme à fenêtre temporelle fixe.
Inconvénients : Il y a toujours un problème : la limite actuelle n'est pas assez fluide. Par exemple : la limite actuelle est de 3 par seconde et 3 requêtes sont envoyées dans la première milliseconde. Si la limite actuelle est atteinte, toutes les requêtes dans la fenêtre de temps restante seront rejetées, ce qui entraînera une mauvaise expérience.
Introduit quatre algorithmes de limitation de courant couramment utilisés : l'algorithme de fenêtre fixe, l'algorithme de fenêtre glissante, l'algorithme de seau à fuite et l'algorithme de seau à jetons. Chaque algorithme a ses propres caractéristiques et scénarios applicables. Résumons-les brièvement et comparons-les ci-dessous.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!