1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yu120-neural

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 25.11.2024 06:28 74fe036

Микросервисная нейронная сеть

[TOC]

<-. (`-')_  (`-')  _              (`-')  (`-')  _           
   \( OO) ) ( OO).-/     .->   <-.(OO )  (OO ).-/    <-.    
,--./ ,--/ (,------.,--.(,--.  ,------,) / ,---.   ,--. )   
|   \ |  |  |  .---'|  | |(`-')|   /`. ' | \ /`.\  |  (`-') 
|  . '|  |)(|  '--. |  | |(OO )|  |_.' | '-'|_.' | |  |OO ) 
|  |\    |  |  .--' |  | | |  \|  .   .'(|  .-.  |(|  '__ | 
|  | \   |  |  `---.\  '-'(_ .'|  |\  \  |  | |  | |     |' 
`--'  `--'  `------' `-----'   `--' '--' `--' `--' `-----'  

Автор: echo(李景枫 или 李茹钰)

Микросервисная архитектура в нейронных сетях обеспечивает отказоустойчивость кластера с помощью трёх основных инструментов: ограничение скорости, понижение уровня и разрыв цепи. Также предоставляются SPI, фильтры, JWT, механизмы повтора и плагины. Кроме того, есть много небольших технических инноваций, таких как белые и чёрные списки IP-адресов, усиленная версия UUID, Snowflake и получение временных меток при высокой параллельной нагрузке.

Основные функции:

  • Ограничение скорости: предназначено для решения проблемы внешних нагрузок.
  • Понижение уровня: предназначено для решения проблем внутренних сервисов.
  • Разрыв цепи: предназначен для обеспечения стабильности внутренних сервисов.
  • Повтор: предназначен для повышения успешности внешних сервисов.

Группа общения

 
QQ группа общения: 191958521(основы микросервисов) WeChat группа общения: echo-lry(запрос на добавление в группу) Публичный аккаунт WeChat: микротехнические стеки

Особенности

  • Распределённое ограничение скорости (Limiter): предназначено для контроля потока вызовов между сервисами и через шлюзы.
  • Понижение уровня сервиса (Degrade): предоставляет распределённый механизм понижения уровня.
  • Персонализированный повтор (Retryer): обеспечивает более интеллектуальный механизм повторов.
  • Аутентификация сервиса (Auth): обеспечивает аутентификацию каждого вызова между распределёнными системами.
  • Трассировка цепочки (Trace): обеспечивает отслеживание вызовов в микросервисной архитектуре.
  • Технические инновации:
    • Perf: инструмент для тестирования производительности, который можно использовать для отдельных методов или блоков кода.
    • NUUID: расширенная версия UUID с более разнообразными правилами генерации.
    • Filter: основанный на цепочке ответственности фильтр.
    • IPFilter: фильтр белых и чёрных списков IP-адресов.
    • Snowflake: распределённая генерация идентификаторов на основе алгоритма Snowflake.
    • SystemClock: решение проблемы производительности при получении временных меток в условиях высокой параллельности.

1 SPI

1.1 Недостатки SPI в JDK

  • В стандартном SPI JDK все реализации точек расширения создаются сразу, что может привести к ненужному использованию ресурсов, если некоторые из них не используются.
  • Не поддерживает внедрение зависимостей (IoC) и аспектно-ориентированное программирование (AOP) для точек расширения.
  • Нет поддержки для упорядочивания реализаций точек расширения.
  • Нет поддержки для группировки реализаций точек расширения по категориям.
  • Нет возможности выбора между одноэлементным и множественным экземплярами для точек расширения.

1.2 Особенности SPI

  • Поддержка создания одноэлементных и множественных экземпляров для точек расширения.
  • Возможность установки точки расширения по умолчанию.
  • Поддержка упорядочивания реализаций точек расширения.
  • Определение категорий для реализаций точек расширения для классификации по нескольким измерениям.
  • Поиск реализаций точек расширения на основе значений категорий.
  • Автоматическое сканирование реализаций точек расширения.
  • Ручное добавление реализаций точек расширения.
  • Получение всех реализаций точек расширения.
  • Создание только необходимых реализаций, решая проблему полного создания в стандартном JDK.
  • Использование пользовательских загрузчиков классов для загрузки классов.

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

1.3 Как использовать

Шаг 1: определение интерфейса

@SPI
public interface IDemo {}

Шаг 2: определение класса реализации интерфейса

@Extension("demo1")
public class Demo1Impl implements IDemo {}

@Extension("demo2")
public class Demo2Impl implements IDemo {}

Шаг 3: создание файла ресурсов интерфейса в формате src/main/resources/META-INF/neural/io.neural.demo.IDemo

Шаг 4: запись полных путей к классам реализации в файле ресурсов интерфейса

io.neural.demo.Demo1Impl
io.neural.demo.Demo2Impl

Шаг 5: использование ExtensionLoader для получения классов реализации интерфейса

public class Demo{
    public static void main(String[] args){
        IDemo demo1 =ExtensionLoader.getLoader(IDemo.class).getExtension("demo1");
        IDemo demo2 =ExtensionLoader.getLoader(IDemo.class).getExtension("demo2"); 
    }
}

2 Ограничение скорости (Limiter)

В распределённых системах ограничение скорости используется в двух сценариях: внутри JVM (in-JVM) и в кластере.

redis-lua.png

2.1 Внутри JVM

2.1.1 Параллелизм (Concurrency)

Для управления используется семафор (Semaphore) из JDK.

public class Test{
    public static void main(String[] args){
        Semaphore semaphore = new Semaphore(10,true);
        semaphore.acquire();
        //do something here
        semaphore.release();
    }
}

2.1.2 Управление скоростью (Rate)

Используется RateLimiter из Google Guava для управления.

public class Test{
    public static void main(String[] args){
        RateLimiter limiter = RateLimiter.create(10.0); // не более 10 задач в секунду
        limiter.acquire(); // запрос RateLimiter
    }
}

2.2 Кластерное ограничение скорости (ожидает завершения)

Распределённое ограничение скорости в основном используется для защиты безопасности кластера или строгого контроля количества запросов пользователей (API-экономика).

https://www.jianshu.com/p/a3d068f2586d

2.3 Ограничение мгновенного параллелизма

  • Определение: количество одновременных запросов/транзакций, обрабатываемых системой.
  • Преимущества: этот алгоритм позволяет контролировать параллелизм.
  • Недостатки: ограниченный спектр применения, обычно используется для контроля входящего трафика.

2.4 Ограничение максимального количества запросов в заданном временном окне

  • Определение: максимальное количество запросов в определённом временном интервале.
  • Преимущества: алгоритм удовлетворяет большинству требований к управлению потоком, позволяя вычислить максимальную скорость запросов (QPS = количество запросов / временное окно).
  • Недостатки: возможны неравномерности в потоке, когда в течение короткого времени поступает большое количество запросов. Когда поток со скоростью v поступает, из ведра со скоростью v берутся жетоны, и поток, получивший жетон, проходит, а поток, не получивший жетона, блокируется. Реализуется логика разрыва цепи.

Свойства:

  • В долгосрочной перспективе скорость потока соответствует скорости добавления жетонов и стабилизируется на уровне r.
  • Из-за ограниченной вместимости ведра можно выдержать всплески трафика:
    • M — максимальная возможная пропускная способность в байтах в секунду. M > r;
    • T max = b / (M - r) — время, в течение которого выдерживается максимальная пропускная способность;
    • B max = T max * M — объём трафика, который может быть передан за время T max при максимальной пропускной способности.

Преимущества: поток более равномерный, и система может выдерживать всплески трафика.

3. Разрыв цепи (CircuitBreaker)

В распределённой архитектуре разрыв цепи может работать в двух режимах: injvm и cluster.

3.1. Статистический разрыв цепи (EventCountCircuitBreaker)

Реализует упрощённую версию разрыва цепи на основе количества событий, произошедших за определённый период времени. Если в течение 10 секунд происходит 5 событий, то цепь разрывается.

3.2. Пороговый разрыв цепи (ThresholdCircuitBreaker)

TODO

4. Снижение уровня сервиса (Degrade) (не завершено)

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

4.1. Управление

4.1.1. Прямое управление: администраторы могут указать, какие модули должны быть понижены

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

4.1.2. Иерархическое управление: администраторам не нужно вникать в детали бизнеса, они могут просто понижать уровни

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

5. Повторная попытка (Retryer)

5.1. Стратегии повторных попыток

5.1.1. Блокирующая стратегия (BlockStrategy)

Текущий поток использует Thread.sleep() для ожидания и повторной попытки.

5.1.2. Стратегия остановки (StopStrategy)

  • NeverStopStrategy: никогда не останавливается.
  • StopAfterAttemptStrategy: останавливается после попытки.
  • StopAfterDelayStrategy: останавливается после задержки.

5.1.3. Стратегия ожидания (WaitStrategy)

  • FixedWaitStrategy: ожидание с фиксированным временем сна.
  • RandomWaitStrategy: случайное ожидание с возможностью установки минимального и максимального времени сна.
  • IncrementingWaitStrategy: постоянное увеличение времени сна после каждой попытки.
  • ExponentialWaitStrategy: экспоненциальное увеличение времени сна с максимальным значением.
  • FibonacciWaitStrategy: использование чисел Фибоначчи для увеличения времени сна с максимальным значением.
  • CompositeWaitStrategy: комбинированная стратегия ожидания, которая объединяет несколько стратегий для определения времени сна.
  • ExceptionWaitStrategy: стратегия ожидания на основе исключений.

5.2. Повторные попытки с учётом результатов

retryIfResult(Predicate< V> resultPredicate): повторные попытки, если результат не удовлетворяет условию. Например, повторная попытка, если возвращаемый результат пуст: retryIfResult(Predicates.< Boolean>isNull()).

5.3. Повторные попытки на основе исключений

  • retryIfException(): повторные попытки для всех исключений.
  • retryIfRuntimeException(): повторные попытки при возникновении исключений во время выполнения.
  • retryIfExceptionOfType(Class<? extends Throwable> exceptionClass): повторные попытки только для исключений указанного типа.
  • retryIfException(Predicate< Throwable> exceptionPredicate): пользовательская фильтрация исключений для повторных попыток.

5.4. Слушатели повторных попыток (RetryListener)

withRetryListener(RetryListener listener): добавление слушателя повторных попыток.

5.5. Ограничитель времени попытки (AttemptTimeLimiter)

withAttemptTimeLimiter(AttemptTimeLimiter< V> attemptTimeLimiter): добавление ограничителя времени попытки.

6. JWT (JSON Web Token)

Функции основаны на проекте java-jwt, но с некоторыми изменениями, которые будут продолжены для упрощения.

7. Фильтры (Filter)

Механизм фильтров реализован на основе расширения @SPI и модели цепочки ответственности.

8. Другие передовые технологии

  • Perf: инструмент для тестирования производительности.
  • IPFilter: фильтр чёрного и белого списков IP-адресов.
  • SystemClock: решение проблемы производительности при получении System.currentTimeMillis() в сценариях с высокой параллельностью.
  • Snowflake: высокопроизводительный генератор длинных идентификаторов на основе алгоритма Snowflake. Теоретическая QPS > 400w/s.
  • MicroUUID: расширение UUID. Поддерживает 36/32/22/19-битные UUID с различной точностью и 15-битные сверхкороткие UUID с потерей точности.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yu120-neural.git
git@api.gitlife.ru:oschina-mirror/yu120-neural.git
oschina-mirror
yu120-neural
yu120-neural
master