Passer au contenu principal
Didit lève 7,5 M$ pour bâtir l'infrastructure pour l'identité et la fraude
Didit
Retour au blog
Blog · 6 mars 2026

Limitation de Débit Dynamique et Coupe-Circuits pour des API d'Identité Résilientes en Go (FR)

Construire des API de vérification d'identité résilientes est crucial. Cet article explore l'implémentation de la limitation de débit dynamique et des coupe-circuits en Go pour protéger vos services contre la surcharge et les.

Par DiditMis à jour le
dynamic-rate-limiting-circuit-breakers-for-resilient-identity-apis-in-go.png

Protégez vos API d'identitéL'implémentation de la limitation de débit dynamique et des coupe-circuits est essentielle pour protéger les API de vérification d'identité contre les abus, la surcharge et les défaillances en cascade, assurant ainsi stabilité et fiabilité.

Go pour la performance et la concurrenceGo offre d'excellentes primitives de concurrence et des performances élevées, ce qui en fait un langage idéal pour construire des microservices robustes et efficaces nécessitant des modèles de résilience sophistiqués.

Une implémentation stratégique est essentielleUne implémentation efficace nécessite une considération attentive des algorithmes (par exemple, le seau à jetons pour la limitation de débit), de la surveillance et de la configuration afin d'équilibrer la protection avec une expérience utilisateur légitime.

Didit simplifie la résilienceDidit fournit intrinsèquement une plateforme de vérification d'identité hautement résiliente et distribuée mondialement, ce qui signifie que vous n'avez pas à construire une logique complexe de limitation de débit et de coupe-circuits à partir de zéro pour vos flux de travail KYC et d'identité de base.

Le besoin critique d'API de vérification d'identité résilientes

Les API de vérification d'identité sont au cœur de nombreux processus métier critiques, de l'intégration des utilisateurs et des transactions financières à l'accès au contenu soumis à une restriction d'âge. La fiabilité et la disponibilité de ces API sont primordiales. Une augmentation du trafic, une attaque malveillante ou une défaillance d'un service en amont peut rapidement dégrader les performances, entraîner des pannes de service et nuire à la confiance des utilisateurs. C'est là que les modèles de résilience comme la limitation de débit dynamique et les coupe-circuits deviennent indispensables, en particulier lors de la construction avec un langage haute performance comme Go.

Imaginez un scénario où votre application s'appuie sur la vérification d'identité de Didit pour l'intégration de nouveaux utilisateurs. Si un attaquant inonde votre système de requêtes, ou si un composant interne subit un ralentissement temporaire, sans protections adéquates, l'ensemble de votre processus d'intégration pourrait s'arrêter. Cela non seulement frustre les utilisateurs légitimes, mais peut également entraîner des coûts importants et des atteintes à la réputation. L'implémentation de ces modèles garantit que votre système peut gérer gracieusement de telles pressions, en maintenant la stabilité et une expérience utilisateur positive.

Implémentation de la limitation de débit dynamique en Go

La limitation de débit contrôle le nombre de requêtes qu'un client peut adresser à un service dans une fenêtre de temps donnée. La limitation de débit dynamique ajuste ces limites en fonction de divers facteurs, tels que la réputation du client, la santé du service ou la charge actuelle. En Go, l'algorithme du seau à jetons est un choix populaire et efficace pour implémenter la limitation de débit.

Algorithme du seau à jetons en Go

Un seau à jetons a une capacité fixe et des jetons y sont ajoutés à un rythme constant. Chaque requête consomme un jeton. Si le seau est vide, la requête est soit refusée, soit mise en file d'attente. La bibliothèque standard de Go fournit le package golang.org/x/time/rate, qui simplifie cette implémentation.

Considérons un scénario utilisant les vérifications Passive & Active Liveness de Didit. Bien que Didit gère sa propre limitation de débit interne, votre application pourrait vouloir limiter le nombre de requêtes de vérification de vivacité par utilisateur pour éviter les abus ou contrôler les coûts. Voici un exemple de base :

package main

import (
	"fmt"
	"log"
	"net/http"
	"sync"
	"time"

	"golang.org/x/time/rate"
)

// clientLimiter holds a rate limiter for each client
type clientLimiter struct {
	limiters map[string]*rate.Limiter
	mu       sync.Mutex
	// Default rate: 10 requests per second with a burst of 20
	defaultLimit *rate.Limiter
}

func newClientLimiter() *clientLimiter {
	return &clientLimiter{
		limiters: make(map[string]*rate.Limiter),
		defaultLimit: rate.NewLimiter(rate.Every(time.Second/10), 20),
	}
}

func (cl *clientLimiter) GetLimiter(clientID string) *rate.Limiter {
	cl.mu.Lock()
	defer cl.mu.Unlock()

	limiter, exists := cl.limiters[clientID]
	if !exists {
		// In a real-world scenario, you might fetch specific limits for clientID from a DB
		// For dynamic limits, you'd adjust rate.Every and burst based on client tiers, etc.
		limiter = rate.NewLimiter(rate.Every(time.Second/5), 10) // Example: 5 req/sec, burst 10 for specific client
		cl.limiters[clientID] = limiter
	}
	return limiter
}

func rateLimitMiddleware(next http.Handler, cl *clientLimiter) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		clientID := r.Header.Get("X-Client-ID") // Or extract from API key, JWT, etc.
		limiter := cl.defaultLimit
		if clientID != "" {
			limiter = cl.GetLimiter(clientID)
		}

		if !limiter.Allow() {
			http.Error(w, "Too many requests", http.StatusTooManyRequests)
			return
		}
		next.ServeHTTP(w, r)
	})
}

func main() {
	clientLimiter := newClientLimiter()

	http.Handle("/verify", rateLimitMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Identity verification request processed!")
	}), clientLimiter))

	log.Println("Server starting on port 8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

Cet exemple démontre un limiteur de débit dynamique de base où différents clients peuvent avoir des limites différentes. Pour des ajustements dynamiques plus sophistiqués, vous vous intégreriez à un service de configuration ou à un système de surveillance pour mettre à jour les paramètres du limiteur en temps réel. Pour des services comme le filtrage et la surveillance AML, où la conformité est essentielle, une limitation de débit précise peut prévenir les interruptions de service qui pourraient entraîner une non-conformité réglementaire.

Implémentation des coupe-circuits en Go

Les coupe-circuits préviennent les défaillances en cascade dans les systèmes distribués. Lorsqu'un service échoue de manière répétée, le coupe-circuit se "déclenche", empêchant l'envoi de nouvelles requêtes au service défaillant pendant une période. Cela donne au service en aval le temps de récupérer et empêche le service en amont de gaspiller des ressources sur des requêtes vouées à l'échec.

États du coupe-circuit : Fermé, Ouvert, Semi-ouvert

  • Fermé : Les requêtes sont autorisées à passer vers le service. Si les défaillances dépassent un seuil, il passe à l'état Ouvert.
  • Ouvert : Les requêtes sont immédiatement rejetées sans appeler le service. Après un délai d'attente, il passe à l'état Semi-ouvert.
  • Semi-ouvert : Un nombre limité de requêtes de test est autorisé. Si celles-ci réussissent, il revient à l'état Fermé ; sinon, il retourne à l'état Ouvert.

Plusieurs bibliothèques Go implémentent des coupe-circuits, telles que github.com/sony/gobreaker. Examinons un exemple d'intégration avec un service externe, peut-être pour une recherche dans une base de données de preuve d'adresse.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"

	"github.com/sony/gobreaker"
)

var cb *gobreaker.CircuitBreaker

func init() {
	st := gobreaker.Settings{
		Name:        "ExternalProofOfAddressService",
		MaxRequests: 3, // Allow 3 requests in half-open state
		Interval:    0, // Count errors forever
		Timeout:     5 * time.Second, // Open state duration
		ReadyToTrip: func(counts gobreaker.Counts) bool {
			return counts.ConsecutiveFailures > 5 // Trip after 5 consecutive failures
		},
		OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) {
			log.Printf("Circuit Breaker '%s' changed from %s to %s", name, from, to)
		},
	}
	cb = gobreaker.NewCircuitBreaker(st)
}

func callProofOfAddressService() (string, error) {
	body, err := cb.Execute(func() (interface{}, error) {
		// Simulate calling an external service
		res, err := http.Get("http://localhost:8081/proof-of-address")
		if err != nil {
			return nil, err // Network errors trip the breaker
		}
		defer res.Body.Close()

		if res.StatusCode != http.StatusOK {
			return nil, fmt.Errorf("service responded with status: %d", res.StatusCode) // Non-200 status also trips
		}

		data, err := ioutil.ReadAll(res.Body)
		if err != nil {
			return nil, err
		}
		return string(data), nil
	})
	
	if err != nil {
		// Handle circuit breaker open error or actual service error
		return "", fmt.Errorf("proof of address service call failed: %w", err)
	}
	return body.(string), nil
}

func main() {
	// Simulate a failing external service (run this in a separate terminal)
	// go func() {
	// 	http.HandleFunc("/proof-of-address", func(w http.ResponseWriter, r *http.Request) {
	// 		time.Sleep(100 * time.Millisecond)
	// 		// Simulate occasional failure
	// 		if time.Now().Second()%10 < 5 {
	// 			http.Error(w, "Internal Server Error", http.StatusInternalServerError)
	// 			return
	// 		}
	// 		fmt.Fprintf(w, "Address verified successfully!")
	// 	})
	// 	log.Fatal(http.ListenAndServe(":8081", nil))
	// }()

	http.HandleFunc("/check-address", func(w http.ResponseWriter, r *http.Request) {
		result, err := callProofOfAddressService()
		if err != nil {
			http.Error(w, err.Error(), http.StatusServiceUnavailable)
			return
		}
		fmt.Fprintf(w, result)
	})

	log.Println("Main server starting on port 8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

Ce coupe-circuit garantit que si le service externe de preuve d'adresse commence à échouer, votre application échouera rapidement et renverra une erreur StatusServiceUnavailable au lieu d'attendre un délai d'expiration. Ceci est vital pour maintenir la réactivité de vos services primaires, même lorsque les dépendances externes flanchent. Pour des services comme la mise en correspondance faciale 1:1 et la recherche faciale, où des réponses en temps réel sont souvent attendues, les coupe-circuits peuvent prévenir une mauvaise expérience utilisateur causée par une latence en amont.

Intégration et surveillance des modèles de résilience

L'implémentation de limiteurs de débit et de coupe-circuits n'est que la moitié de la bataille. Une intégration efficace signifie appliquer ces modèles aux couches appropriées (par exemple, passerelle API, maillage de services ou directement au sein de votre microservice Go). Une surveillance complète est cruciale pour observer quand les coupe-circuits se déclenchent ou quand les limites de débit sont atteintes. Des outils comme Prometheus et Grafana peuvent visualiser ces métriques, vous permettant d'affiner vos configurations et de réagir rapidement aux incidents.

Pour les flux de travail de vérification d'identité, en particulier ceux impliquant des étapes sensibles comme la vérification NFC (ePassport/eID), vous devez vous assurer que ces mécanismes de résilience ne bloquent pas par inadvertance des transactions légitimes de grande valeur. Des ajustements dynamiques basés sur le comportement de l'utilisateur, l'historique des transactions ou les scores de risque (que la plateforme Didit aide à générer) peuvent affiner ces contrôles. Un utilisateur tentant plusieurs requêtes d'estimation de l'âge pourrait être légitime, tandis qu'un bot tentant de forcer une connexion pourrait être malveillant.

Comment Didit vous aide

Bien que l'implémentation de modèles de résilience robustes en Go soit une capacité puissante pour vos services internes, Didit simplifie considérablement la complexité de la vérification d'identité elle-même. Didit est la plateforme d'identité native de l'IA, conçue pour les développeurs, et pensée pour la résilience et l'échelle dès le départ. En tirant parti des services de Didit, vous vous déchargez de la lourde tâche de construire et de maintenir une infrastructure de vérification d'identité hautement disponible et tolérante aux pannes.

  • Résilience intégrée : La plateforme de Didit intègre intrinsèquement des mécanismes de résilience avancés, y compris une limitation de débit interne, un équilibrage de charge et une tolérance aux pannes à travers son infrastructure distribuée mondialement. Cela signifie que vos appels aux API de Didit pour la vérification d'identité, la vivacité passive et active, le filtrage et la surveillance AML, et d'autres services sont déjà protégés.
  • Architecture modulaire : Didit offre une architecture modulaire, vous permettant de composer des flux de travail de vérification précisément selon vos besoins. Chaque module est conçu pour une haute disponibilité, minimisant votre exposition aux points de défaillance uniques.
  • Efficacité native de l'IA : En tant que plateforme native de l'IA, Didit optimise le traitement pour la rapidité et la précision, réduisant la probabilité de goulots d'étranglement internes qui nécessiteraient une logique de résilience côté client complexe.
  • Pas de frais d'installation et KYC de base gratuit : Vous pouvez commencer à tirer parti de la plateforme résiliente de Didit immédiatement avec le niveau gratuit de Didit et bénéficier de sa conception robuste sans investissement initial significatif.

En vous intégrant à Didit, vous pouvez concentrer vos efforts de développement Go sur votre logique métier essentielle, sachant que les composants de vérification d'identité sont gérés par une plateforme de classe mondiale et résiliente.

Prêt à commencer ?

Prêt à voir Didit en action ? Obtenez une démo gratuite dès aujourd'hui.

Commencez à vérifier les identités gratuitement avec le niveau gratuit de Didit.

Infrastructure pour l'identité et la fraude.

Une seule API pour le KYC, le KYB, la surveillance des transactions et le screening de portefeuilles. Intégration en 5 minutes.

Demande à une IA de résumer cette page
Limitation de Débit & Coupe-Circuits pour API d'Identité.