Подробности использования официального ограничителя тока Golang
Подробности использования официального ограничителя тока Golang

Ставка Ограничение) — техническое средство контроля частоты доступа к определенным ресурсам. В службах с высоким уровнем параллелизма текущий механизм ограничения может эффективно предотвратить перегрузку ресурсов и сбой службы, а также обеспечить стабильность и доступность системы. Голанг Официальная стандартная библиотека golang.org/x/time/rate Обеспечивает эффективный и простой в использовании ограничитель тока (скорость Limiter), который может помочь разработчикам легко реализовать функцию ограничения тока. В этой статье будет подробно представлено Golang Как использовать официальный ограничитель тока и принципы, лежащие в его основе.

Основные понятия

Прежде чем более подробно рассказать об использовании, давайте поймем несколько основных понятий:

  1. Алгоритм сегмента токенов
    • Алгоритм ведра токенов — это широко используемый алгоритм ограничения тока. Он работает путем добавления «токенов» в «корзину» через фиксированные интервалы, и перед обработкой запрос должен получить токен из корзины. Если в корзине достаточно токенов, запрос обрабатывается, в противном случае запрос отклоняется или находится в режиме ожидания;
  2. Ставка
    • Скорость определяет, насколько быстро добавляются токены, т. е. сколько токенов добавляется в корзину в секунду.
  3. Емкость (взрывная)
    • Емкость определяет размер корзины, то есть максимальное количество токенов, которые можно хранить в корзине. Он определяет максимальное количество пакетных запросов, разрешенных за определенный период времени.

Базовое использование ограничителя тока Golang

Golang Официальный ограничитель тока реализует алгоритм ведра токенов и находится по адресу golang.org/x/time/rate В сумке. Сначала установите пакеты зависимостей:

Язык кода:javascript
копировать
go get golang.org/x/time/rate

Создать ограничитель тока

использовать rate.NewLimiter Чтобы создать ограничитель скорости, вам необходимо передать два параметра: скорость (количество токенов, генерируемых в секунду) и емкость (размер хранилища токенов).

Язык кода:javascript
копировать
package main

import (
    "fmt"
    "golang.org/x/time/rate"
    "time"
)

func main() {
    // В секунду генерируется 5 токенов, а емкость ведра составляет 10 токенов.
    limiter := rate.NewLimiter(5, 10)

    fmt.Println("Limiter created with rate 5 tokens per second and burst size of 10")
}

запросить разрешение

Создать ограничитель токаназад,может пройти AllowReserveWait ждатьметодзапросить разрешение。

Разрешить метод

Allow Метод немедленно возвращает логическое значение, указывающее, разрешен ли запрос.

Язык кода:javascript
копировать
if limiter.Allow() {
    fmt.Println("Request allowed")
} else {
    fmt.Println("Request denied")
}
Резервный метод

Reserve Метод возвращает Reservation Объект, содержащий информацию о времени и доступности лицензии.

Язык кода:javascript
копировать
reservation := limiter.Reserve()
if reservation.OK() {
    fmt.Println("Request reserved, delay:", reservation.Delay())
} else {
    fmt.Println("Request cannot be reserved")
}
Метод ожидания

Wait Метод блокирует текущую сопрограмму до тех пор, пока запрос не будет разрешен или контекст не будет отменен.

Язык кода:javascript
копировать
ctx := context.Background()
if err := limiter.Wait(ctx); err == nil {
    fmt.Println("Request allowed after wait")
} else {
    fmt.Println("Request denied:", err)
}

Пример: регулирование запросов API

Предположим, у нас есть функция обработки запросов API, которую необходимо регулировать, обрабатывая до 5 запросов в секунду и разрешая пакеты по 10 запросов.

Язык кода:javascript
копировать
package main

import (
    "fmt"
    "golang.org/x/time/rate"
    "net/http"
    "time"
)

var limiter = rate.NewLimiter(5, 10)

func handler(w http.ResponseWriter, r *http.Request) {
    if limiter.Allow() {
        fmt.Fprintln(w, "Request allowed")
    } else {
        http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
    }
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Server started at :8080")
    http.ListenAndServe(":8080", nil)
}

Расширенное использование

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

Скорость динамической регулировки

может пройти SetLimit и SetBurst метод динамически регулирует скорость и мощность ограничителя тока.

Язык кода:javascript
копировать
limiter.SetLimit(10)
limiter.SetBurst(20)

Текущее ограничение нескольких типов ресурсов

Для разных типов ресурсов можно установить отдельные ограничители скорости. Например, мы можем установить разные ограничители тока для операций чтения и записи.

Язык кода:javascript
копировать
var readLimiter = rate.NewLimiter(10, 20)
var writeLimiter = rate.NewLimiter(5, 10)

func readHandler(w http.ResponseWriter, r *http.Request) {
    if readLimiter.Allow() {
        fmt.Fprintln(w, "Read request allowed")
    } else {
        http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
    }
}

func writeHandler(w http.ResponseWriter, r *http.Request) {
    if writeLimiter.Allow() {
        fmt.Fprintln(w, "Write request allowed")
    } else {
        http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
    }
}

func main() {
    http.HandleFunc("/read", readHandler)
    http.HandleFunc("/write", writeHandler)
    fmt.Println("Server started at :8080")
    http.ListenAndServe(":8080", nil)
}

Используйте контекст для ограничения трафика

Передавая объект контекста, можно реализовать управление или отмену тайм-аута во время текущего процесса ограничения.

Язык кода:javascript
копировать
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

if err := limiter.Wait(ctx); err != nil {
    fmt.Println("Request denied:", err)
} else {
    fmt.Println("Request allowed")
}

Пользовательское время ожидания

Reserve метод возвращает Reservation Объект содержит определенное время ожидания, а логику обработки можно настроить в соответствии с потребностями бизнеса.

Язык кода:javascript
копировать
reservation := limiter.Reserve()
if reservation.OK() {
    waitTime := reservation.Delay()
    time.Sleep(waitTime)
    fmt.Println("Request processed after waiting:", waitTime)
} else {
    fmt.Println("Request denied")
}

партиязапросить разрешение

Можно запросить несколько токенов одновременно, что полезно при обработке пакетных операций.

Язык кода:javascript
копировать
if limiter.AllowN(time.Now(), 3) {
    fmt.Println("Batch request allowed")
} else {
    fmt.Println("Batch request denied")
}

Оптимизация производительности

Когда использовать ограничитель тока,Необходимо учитывать накладные расходы на производительность。rate.Limiter легкий,Но в сценариях с высоким параллелизмом,Частые запросы и выпуски токенов могут привести к определенным затратам производительности. Вот несколько предложений по оптимизации:

  1. Разумно установите скорость и мощность
    • Установите скорость и мощность разумно в соответствии с фактическими потребностями бизнеса, чтобы избежать слишком высоких или слишком низких значений.
  2. Пакетная обработка
    • Постарайтесь максимально объединить запросы, чтобы уменьшить частоту выполнения одного запроса. Например, вы можете подать заявку на несколько токенов одновременно на текущем ограничителе для Пакетной. обработка。
  3. Асинхронная обработка
    • Для запросов некритического пути используйте Асинхронную обработка, уменьшающая препятствия для основного бизнес-процесса.
  4. Мониторинг и настройка
    • Постоянно контролируйте работу ограничителя тока и выполняйте динамическую настройку на основе фактического трафика и условий запроса.

в заключение

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

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.