


Comment utiliser Golang pour implémenter la limitation du courant des requêtes
Avec l'utilisation croissante des applications Web modernes, de nombreuses demandes d'utilisateurs commencent à affluer sur le serveur, ce qui provoque certains problèmes. D'une part, les performances du serveur sont limitées et il n'y a aucune garantie que toutes les requêtes puissent être traitées ; d'autre part, un grand nombre de requêtes arrivant en même temps peut rendre le service instable ; À l'heure actuelle, limiter le taux de requêtes est devenu un choix inévitable. Ce qui suit présente comment utiliser Golang pour implémenter la limitation du courant de requête.
Qu'est-ce que la limitation actuelle ?
La limitation actuelle fait référence à la limitation du nombre maximum de requêtes ou de trafic de données qu'une application, un système ou un service peut supporter pendant une certaine période de temps. La limitation actuelle peut nous aider à atténuer les attaques réseau et à prévenir les abus de bande passante et de ressources. Nous appelons généralement cette limite « contrôle de flux », qui peut hiérarchiser les demandes de différents types et sources et traiter les demandes de différents types et sources dans différentes proportions.
Implémenter la limitation de courant de demande
Algorithme de limitation de courant de fenêtre basé sur la fenêtre de temps
L'algorithme le plus simple et le plus direct est l'algorithme de limitation de courant basé sur la fenêtre de temps. Il vérifie si le nombre total de requêtes envoyées au cours de la période la plus récente dépasse un seuil. La durée de la fenêtre temporelle peut être ajustée en fonction des caractéristiques de l'application pour obtenir des performances optimales et un taux de fausses alarmes minimum.
Supposons que nous devions limiter le nombre maximum d'accès par seconde à une API. Nous pouvons utiliser le package time de Golang pour compter le trafic et utiliser des canaux tampons pour implémenter des files d'attente de requêtes. Le code est le suivant :
type ApiLimiter struct { rate float64 // 时间窗口内最大请求数 capacity int // 请求队列最大长度,即最多能有多少请求同时被处理 requestNum int // 时间窗口内已处理请求总数 queue chan int // 缓冲通道,用于实现请求队列 } func NewApiLimiter(rate float64, capacity int) *ApiLimiter { return &ApiLimiter{ rate: rate, capacity: capacity, requestNum: 0, queue: make(chan int, capacity), } } func (al *ApiLimiter) Request() bool { now := time.Now().UnixNano() maxRequestNum := int(float64(now)/float64(time.Second)*al.rate) + 1 // 统计最近一秒内应该处理的请求数量 if maxRequestNum <p>Dans cet exemple, nous utilisons chan dans Golang pour implémenter la file d'attente des requêtes et utilisons le package time pour calculer le nombre de requêtes dans la fenêtre de temps. Une fois que chaque requête atteint le serveur, nous mettrons la requête dans la file d'attente et le volume de la requête sera également comparé au nombre maximum de requêtes. Si le nombre maximum de requêtes est dépassé, false sera renvoyé. </p><h3 id="Leaky-Bucket-Algorithm">Leaky Bucket Algorithm</h3><p>Leaky Bucket Algorithm est un autre algorithme de limitation de courant célèbre. À tout moment, le bucket qui fuit conserve un certain nombre de requêtes. Lorsqu'une nouvelle demande arrive, vérifiez d'abord si le nombre de demandes restant dans le compartiment qui fuit atteint le montant maximum de la demande. Si tel est le cas, rejetez la nouvelle demande, sinon, placez la nouvelle demande dans le compartiment et réduisez le nombre de demandes dans le compartiment. par un. </p><p>L'algorithme du bucket qui fuit peut être implémenté à l'aide de coroutines et de minuteries dans Golang. Nous pouvons utiliser une minuterie pour représenter notre seau qui fuit et qui s'écoule lentement des requêtes au fil du temps. Le code est le suivant : </p><pre class="brush:php;toolbar:false">type LeakyBucket struct { rate float64 // 漏桶每秒处理的请求量(R) capacity int // 漏桶的大小(B) water int // 漏桶中当前的水量(当前等待处理的请求个数) lastLeaky int64 // 上一次请求漏出的时间,纳秒 leakyTimer *time.Timer // 漏桶接下来漏水需要等待的时间 reject chan int // 被拒绝的请求通道 } func NewLeakyBucket(rate float64, capacity int) *LeakyBucket { bucket := &LeakyBucket{ rate: rate, capacity: capacity, water: 0, reject: make(chan int, 1000), } bucket.leakyTimer = time.NewTimer(time.Second / time.Duration(rate)) return bucket } func (lb *LeakyBucket) Request() chan int { select { case 0 { lb.water -= 1 lb.leakyTimer.Reset(time.Second / time.Duration(lb.rate)) return nil // 请求被允许 } lb.leakyTimer.Reset(time.Second / time.Duration(lb.rate)) return lb.reject // 请求被拒绝 default: if lb.water >= lb.capacity { return lb.reject // 请求被拒绝 } else { lb.water += 1 // 请求被允许 return nil } } }
Dans cet exemple, nous utilisons le timer de Golang pour réaliser le taux de sortie du seau qui fuit, et utilisons chan pour réaliser la mise en mémoire tampon des requêtes. Nous avons d'abord créé une minuterie pour vérifier régulièrement le nombre de demandes restantes (eau) dans le seau qui fuit. Avant que la demande ne soit acceptée, nous vérifierons d'abord si elle a atteint la capacité maximale à traiter. Si tel est le cas, nous renverrons un rejet ; sinon, nous le mettrons dans un seau qui fuit et ajouterons 1 à la quantité d'eau.
Autres réflexions
Dans cet article, nous présentons deux algorithmes courants de limitation de courant de requête : l'algorithme de limitation de courant basé sur une fenêtre et l'algorithme de compartiment à fuite. Cependant, il existe de nombreuses autres variantes de ces algorithmes, telles que le contrôle de flux basé sur l'importance de la requête ou combiné à des structures de données de file d'attente. Golang lui-même présente d'excellents modèles de concurrence et de coroutine, ce qui en fait l'un des meilleurs outils pour implémenter la limitation des requêtes.
À l'avenir, avec le développement en profondeur de l'intelligence artificielle, du big data et d'autres technologies, nous aurons besoin de meilleurs algorithmes de limitation de courant pour prendre en charge le fonctionnement de nos applications. Alors, avant d’aller plus loin, explorons et étudions ensemble ce domaine en constante évolution.
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!

GolangisidealforBuildingsCalableSystemsDuetoitSefficiency and Concurrency, tandis que les Implicites de l'Indrecosystem et le Golang'sDesignenCourageSlecElNCORES

Golang est meilleur que C en concurrence, tandis que C est meilleur que Golang en vitesse brute. 1) Golang obtient une concurrence efficace par le goroutine et le canal, ce qui convient à la gestion d'un grand nombre de tâches simultanées. 2) C Grâce à l'optimisation du compilateur et à la bibliothèque standard, il offre des performances élevées près du matériel, adaptées aux applications qui nécessitent une optimisation extrême.

Les raisons du choix de Golang comprennent: 1) des performances de concurrence élevées, 2) un système de type statique, 3) un mécanisme de collecte des ordures, 4) des bibliothèques et des écosystèmes standard riches, ce qui en fait un choix idéal pour développer des logiciels efficaces et fiables.

Golang convient au développement rapide et aux scénarios simultanés, et C convient aux scénarios où des performances extrêmes et un contrôle de bas niveau sont nécessaires. 1) Golang améliore les performances grâce à des mécanismes de collecte et de concurrence des ordures, et convient au développement de services Web à haute concurrence. 2) C réalise les performances ultimes grâce à la gestion manuelle de la mémoire et à l'optimisation du compilateur, et convient au développement du système intégré.

Golang fonctionne mieux en temps de compilation et en traitement simultané, tandis que C présente plus d'avantages dans la vitesse d'exécution et la gestion de la mémoire. 1.Golang a une vitesse de compilation rapide et convient pour un développement rapide. 2.C fonctionne rapidement et convient aux applications critiques. 3. Golang est simple et efficace dans le traitement simultané, adapté à la programmation simultanée. 4.C La gestion de la mémoire manuelle offre des performances plus élevées, mais augmente la complexité du développement.

L'application de Golang dans les services Web et la programmation système se reflète principalement dans sa simplicité, son efficacité et sa concurrence. 1) Dans les services Web, Golang prend en charge la création d'applications Web et d'API à haute performance via des bibliothèques HTTP puissantes et des capacités de traitement simultanées. 2) Dans la programmation système, Golang utilise des fonctionnalités proches du matériel et de la compatibilité avec le langage C pour être adapté au développement du système d'exploitation et aux systèmes intégrés.

Golang et C ont leurs propres avantages et inconvénients dans la comparaison des performances: 1. Golang convient à une concurrence élevée et à un développement rapide, mais la collecte des ordures peut affecter les performances; 2.C fournit des performances plus élevées et un contrôle matériel, mais a une complexité de développement élevée. Lorsque vous faites un choix, vous devez considérer les exigences du projet et les compétences en équipe de manière complète.

Golang convient aux scénarios de programmation haute performance et simultanés, tandis que Python convient au développement rapide et au traitement des données. 1.Golang met l'accent sur la simplicité et l'efficacité, et convient aux services back-end et aux microservices. 2. Python est connu pour sa syntaxe concise et ses bibliothèques riches, adaptées à la science des données et à l'apprentissage automatique.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

PhpStorm version Mac
Le dernier (2018.2.1) outil de développement intégré PHP professionnel

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP

Version Mac de WebStorm
Outils de développement JavaScript utiles

Navigateur d'examen sécurisé
Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit