Использование идемпотентного плагина интерфейса Spring Boot

Java Spring

Обзор идемпотента

  • Идемпотентность изначально была математической концепцией, даже если формула: f(x)=f(f(x)) может содержать математические свойства. В области программирования это означает, что для одной и той же системы, использующей одни и те же условия, один и несколько повторяющихся запросов оказывают одинаковое влияние на системные ресурсы.

  • Идемпотентность — очень важное понятие при проектировании распределенных систем, интерфейсы с этим свойством всегда разрабатываются с таким понятием:Когда интерфейс вызова происходит и повторяется, это всегда приводит к тому, что система не может противостоять системе, поэтому необходимо предотвратить возникновение этого явления..

  • Существует множество способов достижения идемпотентности, и текущий механизм токена запроса имеет широкий спектр применений. Основная идея заключается в создании уникальных учетных данных, токенов, для каждой операции. Токен имеет только одно право на выполнение на каждом этапе операции, и после успешного выполнения результат выполнения сохраняется. При повторных запросах возвращать тот же результат (ошибка) и т. д.Обратитесь к «Краткому разговору об идемпотентности».[1]

Реализация идемпотентной обработки

добавить зависимости

<dependency>
    <groupId>com.pig4cloud.plugin</groupId>
    <artifactId>idempotent-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</dependency>

Настроить ссылку Redis

  • По умолчанию его нельзя настроить. теория поддерживаетсяredisson-spring-boot-starter[2]Вся конфигурация
spring:
  redis:
    host: 127.0.0.1
    port: 6379

интерфейс

@Idempotent(key = "#key", expireTime = 10, info = "请勿重复查询")
@GetMapping("/test")
public String test(String key) {
    return "success";
}

контрольная работа

  • 10 независимых запросов потоков
  • Выполните для просмотра результатов, только один из 10 запросов будет успешным.

  • Проверьте ошибки фонового исключения, 9 ошибок исключения соответствуют ожиданиям

описание идемпотентной аннотации

  • ключ: уникальный идентификатор идемпотентной операции, использующий выражения spring el для ссылки на параметры метода с помощью # .Если он может быть пустым, возьмите текущий URL + аргументы в качестве уникального идентификатора запроса.

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

  • timeUnit: единица измерения времени по умолчанию: с (секунды)

  • информация: идемпотентная информация о сбое, настраивается

  • delKey: удалять ли ключ после завершения дела true: удалять false: не удалять

Принципы разработки идемпотентной обработки

Ссылка на разработку процесса[3]

  • 1. Перед стартовым запросом, в соответствии с найденным в результатах ключом запроса: Results not found ошибка: сохраненный ключ-значение-expireTime key=ip+url+args

  • 2.После завершения запроса удалите ключ напрямую.Независимо от того, существует ли ключ, удалите его напрямую.Удалять или нет можно настроить.

  • 3. expireTime – это время истечения срока действия, чтобы предотвратить зависание запроса и его постоянную блокировку. Если время истечения превышает время истечения, оно будет автоматически удалено. Время истечения больше, чем время выполнения бизнеса, и его необходимо быть приблизительно оценен;

  • 4. Это решение напрямую снижает уровень запроса интерфейса.

  • 5. Время истечения должно быть больше, чем время бизнес-выполнения, в противном случае бизнес-запрос 1 все еще выполняется, а внешний интерфейс не маскируется, или пользователь переходит на страницу, а затем возвращается, чтобы повторить запрос 2. На уровне бизнеса результат все еще не соответствует ожидаемому.

  • 6. Рекомендуется, чтобы delKey = false. Даже если дело завершено, ключ не удаляется, а время expireTime принудительно блокируется. Предотвратить 5.

  • 7. Реализация идеи: тот же Request ip и интерфейсы, те же параметры, повторные запросы в течение expireTime, успешные только один раз.

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

  • 9. Эта аннотация используется только для идемпотентности, а не для блокировок. Будут проблемы с 100 одновременными стресс-тестами. В этом сценарии это бессмысленно. На практике пользователи не будут вручную отправлять 50 в течение 1 с или 3 с. или 100 повторных запросов, или 100 повторных запросов при слабой сети;

Суммировать

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

[1]

Обратитесь к «Краткому разговору об идемпотентности»:https://www.jianshu.com/p/475589f5cd7b

[2]

redisson-spring-boot-starter: https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter

[3]

Ссылка на дизайн процесса:https://github.com/it4alla/idempotent