Обзор идемпотента
-
Идемпотентность изначально была математической концепцией, даже если формула: 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