Поддерживайте работоспособность сервиса при скачках трафика

Go

Сервисная адаптивная защита от сброса нагрузки

цель дизайна

  • Убедитесь, что система не перегружена чрезмерными запросами
  • Обеспечьте максимально высокую пропускную способность на основе обеспечения стабильности системы.

Рекомендации по дизайну

  • Как измерить загрузку системы
    • Будь то виртуальная машина или контейнер, необходимо читать нагрузки, связанные с cgroup.
    • Используйте 1000 м для представления 100% ЦП, а 800 м рекомендуется для представления высокой загрузки системы.
  • Как можно меньше накладных расходов без значительного увеличения RT
  • Вне зависимости от системных проблем БД или кэша, от которых зависит сам сервис, такие проблемы решает механизм прерывателя цепи

конструкция механизма

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

    • Скользящее среднее должно принимать приблизительное среднее из предыдущих N последовательных значений, а значение N может быть определено с помощью гиперпараметра бета.
    • Когда загрузка ЦП превышает указанное значение, срабатывает механизм защиты от снижения нагрузки.
  • Механизм временного окна, используйте механизм скользящего окна для записи QPS и RT (время ответа) в предыдущем временном окне.

    • Скользящее окно использует 50 сегментов за 5 секунд, каждый сегмент сохраняет запросы в течение 100 мс и перерабатывает самые последние запросы поверх самых старых.
    • При расчете maxQPS и minRT необходимо отфильтровать сегмент с самым последним неиспользованным временем, чтобы не допустить, что в этом сегменте всего несколько запросов, а RT находится на минимальном значении с малой вероятностью, поэтому при рассчитывая maxQPS и minRT, следуйте параметрам вышеуказанных 50 сегментов, считайте только 49
  • Запрос отклонен, если выполняются все следующие условия

    1. Текущая загрузка ЦП превышает заданный порог, или время последнего отказа не превысило 1 секунду (период охлаждения). Период охлаждения предназначен для предотвращения увеличения нагрузки сразу же после того, как оно упадет, вызывая колебание вперед и назад, когда оно снова поднимается.

    2. averageFlying > max(1, QPS*minRT/1e3)

      • averageFlying = MovingAverage(flying)

      • При расчете MovingAverage(flying) значение гиперпараметра beta по умолчанию равно 0,9, что означает, что вычисляется среднее значение пролетов первых десяти раз.

      • При определении летающей стоимости существует три подхода:

        1. После добавления запроса обновляется средний полет, см. кривую Orange
        2. Обновить средний полет один раз после завершения запроса, см. зеленую кривую на рисунке
        3. Обновить AverageFlying один раз после добавления запроса и обновить AverageFlying один раз после завершения запроса.

        Мы используем второй, который может лучше предотвратить джиттер, как показано на рисунке:flying策略对比

      • QPS = maxPass * bucketsPerSecond

        • maxPass представляет успешные запросы в каждом допустимом сегменте.
        • BucketsPerSecond указывает, сколько сегментов в секунду
      • 1e3 означает 1000 миллисекунд, единица измерения minRT также равна миллисекундам QPS*minRT/1e3 получает среднее количество одновременных запросов в каждый момент времени.

Использование сброса нагрузки

  • Опциональная конфигурация активации была добавлена ​​в фреймворки rest и zrpc.
    • CpuThreshold, если установлено значение больше 0, активируется механизм автоматического снижения нагрузки сервиса
  • Если запрос будет отклонен, в журнале ошибок будетdropreqключевые слова

использованная литература

адрес проекта

GitHub.com/them-specialty/go…

Если вы считаете, что статья хорошая, добро пожаловатьgithubнажмитеstar🤝