Микросервисная нейронная сеть
[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) и в кластере.

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 )