Перейти к основному содержимому
Didit привлёк $7,5 млн на инфраструктуру для идентификации и борьбы с мошенничеством
Didit
В блог
Блог · 6 марта 2026 г.

Динамическое ограничение скорости и автоматические выключатели для отказоустойчивых API идентификации в Go (RU)

Создание отказоустойчивых API для проверки личности имеет решающее значение. В этой статье рассматривается реализация динамического ограничения скорости и автоматических выключателей в Go для защиты ваших сервисов от перегрузок.

Автор: DiditОбновлено
dynamic-rate-limiting-circuit-breakers-for-resilient-identity-apis-in-go.png

Защитите свои API идентификацииВнедрение динамического ограничения скорости и автоматических выключателей крайне важно для защиты API проверки личности от злоупотреблений, перегрузок и каскадных сбоев, обеспечивая стабильность и надежность.

Go для производительности и параллелизмаGo предлагает отличные примитивы параллелизма и производительность, что делает его идеальным языком для создания надежных и эффективных микросервисов, требующих сложных моделей отказоустойчивости.

Ключевое значение имеет стратегическое внедрениеЭффективное внедрение требует тщательного рассмотрения алгоритмов (например, "маркерное ведро" для ограничения скорости), мониторинга и конфигурации для балансировки защиты с легитимным пользовательским опытом.

Didit упрощает отказоустойчивостьDidit изначально предоставляет высокоотказоустойчивую, глобально распределенную платформу проверки личности, что означает, что вам не нужно с нуля создавать сложную логику ограничения скорости и автоматических выключателей для ваших основных рабочих процессов KYC и идентификации.

Критическая необходимость в отказоустойчивых API для проверки личности

API для проверки личности лежат в основе многих критически важных бизнес-процессов, от регистрации пользователей и финансовых транзакций до доступа к контенту с возрастными ограничениями. Надежность и доступность этих API имеют первостепенное значение. Всплеск трафика, вредоносная атака или сбой вышестоящей службы могут быстро ухудшить производительность, привести к сбоям в работе службы и подорвать доверие пользователей. Именно здесь модели отказоустойчивости, такие как динамическое ограничение скорости и автоматические выключатели, становятся незаменимыми, особенно при создании систем на высокопроизводительном языке, таком как Go.

Представьте себе сценарий, когда ваше приложение полагается на проверку личности Didit для регистрации новых пользователей. Если злоумышленник заваливает вашу систему запросами или если внутренний компонент испытывает временное замедление, без надлежащих мер защиты весь ваш процесс регистрации может застопориться. Это не только разочаровывает законных пользователей, но также может повлечь за собой значительные затраты и ущерб репутации. Внедрение этих моделей гарантирует, что ваша система сможет изящно справляться с такими нагрузками, поддерживая стабильность и положительный пользовательский опыт.

Внедрение динамического ограничения скорости в Go

Ограничение скорости контролирует количество запросов, которые клиент может сделать к службе в течение заданного промежутка времени. Динамическое ограничение скорости регулирует эти лимиты на основе различных факторов, таких как репутация клиента, работоспособность службы или текущая нагрузка. В Go алгоритм "маркерного ведра" является популярным и эффективным выбором для реализации ограничения скорости.

Алгоритм "маркерного ведра" в Go

Маркерное ведро имеет фиксированную емкость, и токены добавляются в него с постоянной скоростью. Каждый запрос потребляет один токен. Если ведро пусто, запрос либо отклоняется, либо ставится в очередь. Стандартная библиотека Go предоставляет пакет golang.org/x/time/rate, который упрощает эту реализацию.

Рассмотрим сценарий использования пассивных и активных проверок живости Didit. Хотя Didit обрабатывает собственное внутреннее ограничение скорости, ваше приложение может захотеть ограничить количество запросов на проверку живости для каждого пользователя, чтобы предотвратить злоупотребления или контролировать затраты. Вот базовый пример:

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))
}

Этот пример демонстрирует базовый динамический ограничитель скорости, где разные клиенты могут иметь разные лимиты. Для более сложных динамических настроек вы бы интегрировались со службой конфигурации или системой мониторинга для обновления параметров ограничителя в реальном времени. Для таких сервисов, как проверка и мониторинг AML, где соответствие требованиям имеет решающее значение, точное ограничение скорости может предотвратить сбои в работе сервиса, которые могут привести к несоответствию нормативным требованиям.

Внедрение автоматических выключателей в Go

Автоматические выключатели предотвращают каскадные сбои в распределенных системах. Когда служба неоднократно дает сбой, автоматический выключатель "срабатывает", предотвращая отправку дальнейших запросов к сбойной службе на определенный период. Это дает нижестоящей службе время для восстановления и предотвращает трату ресурсов вышестоящей службой на обреченные запросы.

Состояния автоматического выключателя: замкнутый, разомкнутый, полуоткрытый

  • Замкнутый: Запросы разрешены для прохождения к службе. Если сбои превышают пороговое значение, он переходит в разомкнутое состояние.
  • Разомкнутый: Запросы немедленно отклоняются без вызова службы. После тайм-аута он переходит в полуоткрытое состояние.
  • Полуоткрытый: Разрешено ограниченное количество тестовых запросов. Если они успешны, он возвращается в замкнутое состояние; в противном случае он возвращается в разомкнутое состояние.

Несколько библиотек Go реализуют автоматические выключатели, например github.com/sony/gobreaker. Давайте рассмотрим пример интеграции с внешней службой, возможно, для поиска в базе данных подтверждения адреса.

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))
}

Этот автоматический выключатель гарантирует, что если внешняя служба подтверждения адреса начнет давать сбои, ваше приложение быстро выдаст ошибку StatusServiceUnavailable вместо того, чтобы ждать тайм-аута. Это жизненно важно для поддержания отзывчивости ваших основных служб, даже когда внешние зависимости дают сбой. Для таких сервисов, как сравнение лица 1:1 и поиск по лицу, где часто ожидаются ответы в реальном времени, автоматические выключатели могут предотвратить плохой пользовательский опыт, вызванный задержкой вышестоящего уровня.

Интеграция и мониторинг моделей отказоустойчивости

Реализация ограничителей скорости и автоматических выключателей — это только полдела. Эффективная интеграция означает применение этих моделей на соответствующих уровнях (например, шлюз API, сервисная сетка или непосредственно в вашем микросервисе Go). Комплексный мониторинг имеет решающее значение для отслеживания срабатывания автоматических выключателей или достижения ограничений скорости. Такие инструменты, как Prometheus и Grafana, могут визуализировать эти метрики, позволяя вам точно настраивать конфигурации и быстро реагировать на инциденты.

Для рабочих процессов проверки личности, особенно тех, которые включают конфиденциальные шаги, такие как верификация NFC (электронный паспорт/электронное удостоверение личности), необходимо убедиться, что эти механизмы отказоустойчивости непреднамеренно не блокируют законные дорогостоящие транзакции. Динамические корректировки на основе поведения пользователя, истории транзакций или оценок рисков (которые помогает генерировать платформа Didit) могут уточнить эти элементы управления. Пользователь, пытающийся выполнить несколько запросов на оценку возраста, может быть законным, в то время как бот, пытающийся "взломать" систему, может быть злоумышленником.

Как Didit помогает

Хотя реализация надежных моделей отказоустойчивости в Go является мощной возможностью для ваших внутренних служб, Didit значительно упрощает саму сложность проверки личности. Didit — это AI-нативная платформа идентификации, ориентированная на разработчиков и изначально разработанная для обеспечения отказоустойчивости и масштабируемости. Используя сервисы Didit, вы снимаете с себя тяжелую работу по созданию и поддержке высокодоступной и отказоустойчивой инфраструктуры проверки личности.

  • Встроенная отказоустойчивость: Платформа Didit изначально включает в себя передовые механизмы отказоустойчивости, включая внутреннее ограничение скорости, балансировку нагрузки и отказоустойчивость в своей глобально распределенной инфраструктуре. Это означает, что ваши вызовы к API Didit для проверки личности, пассивной и активной проверки живости, проверки и мониторинга AML и других сервисов уже защищены.
  • Модульная архитектура: Didit предлагает модульную архитектуру, позволяющую точно настраивать рабочие процессы проверки под ваши нужды. Каждый модуль разработан для обеспечения высокой доступности, минимизируя вашу подверженность единым точкам отказа.
  • AI-нативная эффективность: Будучи AI-нативной платформой, Didit оптимизирует обработку для скорости и точности, снижая вероятность внутренних узких мест, которые потребовали бы сложной логики отказоустойчивости на стороне клиента.
  • Отсутствие платы за настройку и бесплатный базовый KYC: Вы можете начать использовать отказоустойчивую платформу Didit немедленно с бесплатным тарифом Didit и пользоваться ее надежным дизайном без значительных первоначальных инвестиций.

Интегрируясь с Didit, вы можете сосредоточить свои усилия по разработке на Go на основной бизнес-логике, зная, что компоненты проверки личности обрабатываются платформой мирового класса с высокой отказоустойчивостью.

Готовы начать?

Готовы увидеть Didit в действии? Получите бесплатную демонстрацию сегодня.

Начните бесплатно проверять личность с бесплатным тарифом Didit.

Инфраструктура для идентификации и борьбы с мошенничеством.

Единый API для KYC, KYB, мониторинга транзакций и проверки кошельков. Интеграция за 5 минут.

Попросите ИИ кратко изложить эту страницу
Ограничение скорости и выключатели для API идентификации в.