Текущая стратегия ограничения в сценариях с высокой степенью параллелизма

Java Архитектура
Текущая стратегия ограничения в сценариях с высокой степенью параллелизма

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

Сегодня мы поговорим о троттлинге.

Введение

Зачем нам нужен дроссель?

Чтобы привести относительно простой пример, обычно сотрудник А может выполнять 10 заданий в день.Внезапно в один день появляется 100 заданий.В настоящее время, если сотрудник А все еще обрабатывает 100 заданий,есть только одна возможность.Этот сотрудник перегружен.

Если мы можем заранее знать, что вернется 100 задач, мы можем увеличить количество сотрудников или определить очередь сообщений и так далее. Но часто мы не можем предвидеть эти сюрпризы. в соответствии сзакон Мерфи, плохие вещи часто следуют одно за другим, и не исключено, что сбой в какой-то момент вызовет глобальный сбой (лавину). Таким образом, мы должны были сделать некоторую защиту для нашей системы. Текущее дросселирование является одним из них.

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

Счетчик в режиме ограничения тока (протокол скользящего окна)

идеи: Ограничение скорости, первое, что мы могли бы подумать, это то, что я использую счетчик для выполнения технологии.Если он превышает порог счетчика, это означает, что скорость слишком высока. Один счетчик в секунду.

счетчик.png

Для удобства чтения я привожу скриншот только основного фрагмента кода.


сегмент кода

С этим есть проблема: зернистость слишком большая и неравномерная, и за одну секунду различить невозможно.

Можем ли мы разбить гранулярность, 1 секунда делится на 10 100 миллисекунд. Есть счетчик на каждые 100 мс. Те, кто разбирается в TCP/IP, должны знать, что для увеличения скорости передачи и управления скоростью передачи TCP/IP существует «протокол скользящего окна».

Как бы мелко он ни был разобран, он не может решить проблему равномерного ограничения скорости.

Существует также проблема критической точки, например, если существует ограничение в 10 запросов в секунду между первой и второй секундами, 10 запросов во второй половине первой секунды и 10 запросов в первой половине второй. во-вторых, есть 20 запросов за одну секунду, состоящих из второй половины первой секунды и первой половины второй секунды, которая не работает как ограничитель скорости.

Есть ли способ лучше?

Алгоритм дырявого ведра для ограничения скорости

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

идеи: Ведро - вместилище, а капля воды - просьба. Если ведро заполнено, запрос отклоняется, и запрос обрабатывается, когда он не заполнен.

Алгоритм дырявого ведра.png

сегмент кода


алгоритм дырявого ведра

в коде фрагмента

  • Сначала подсчитайте общее количество воды, утекшей между этим запросом и последним запросом.
  • Проверьте, сколько воды осталось в ведре, и посмотрите, не переливается ли она.
  • Отклонить запрос, если он переполнен, если не добавить текущий дроп. Обработайте запрос.

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

Что это обозначает? То есть я долго бездельничал перед сервисом, и вдруг запросов очень много (в пределах вместимости ведра), и мне надо быстро с ними разбираться.

Алгоритм Token Bucket для ограничения скорости

идеи: генерировать токены с постоянной скоростью, бросать их в ведро и проверять, есть ли лишние токены каждый раз, когда делается запрос. Если есть токен для ведения обычных дел, ограничения скорости нет.

ведро токенов.png

сегмент кода


код корзины токенов

Таким образом, вы можете разрешить мгновенную массовую обработку, а затем выполнить обработку с ограничением скорости.

  • Когда приходит запрос, сначала подсчитайте количество токенов, помещенных в данный момент в ведро. Вычисляя здесь, вы можете размещать токены с постоянной скоростью, не запуская поток. Это называется ленивым вычислением.
  • Затем подсчитайте количество токенов, принадлежащих корзине. Тогда получите жетон. Отклонить или обработать действие.

Вы можете использовать приведенный выше код в
GitHub.com/Привет для/Java…
оказаться.

Автономный ограничитель скорости RateLimiter

Amway всем эффективный ограничитель скорости. Базовая библиотека Google guava содержит ограничитель скорости на основе токенов RateLimiter. Он также очень прост в использовании.


прецедент

Я тут все это видел, обратите внимание на паблик, давайте обмениваться и учиться вместе


Публичный аккаунт WeChat rudy_tan_home