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

OSCHINA-MIRROR/log4j-idempotent-spring-boot-starter

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 6.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 18:07 4478e7d

Идемпотентная обработка

Это рефакторинг существующего кода idempotent и расширение его функциональности.

Большое спасибо автору idempotent за его вклад.

1. Принцип

  1. Перед запросом проверяем наличие результата по ключу: если результат есть, то возвращаем ошибку; если результата нет, сохраняем ключ-значение-expireTime (key = ip + url + args).
  2. После завершения запроса сразу удаляем ключ, независимо от того, существует он или нет. Возможность удаления настраивается.
  3. Время истечения срока действия (expireTime) предотвращает блокировку запросов, которые могут быть заблокированы на долгое время. Срок действия должен быть больше времени выполнения бизнес-операции. Необходимо провести приблизительную оценку.
  4. Этот подход непосредственно влияет на уровень интерфейса запросов.
  5. Время истечения должно быть больше времени выполнения бизнес-процесса, иначе запрос 1 может всё ещё выполняться, когда пользователь делает повторный запрос 2 без блокировки. На уровне бизнес-логики результат будет не соответствовать ожиданиям.
  6. Рекомендуется установить delKey = false. Это означает, что даже после успешного выполнения бизнес-операции ключ не удаляется, а срок действия блокируется. Это предотвращает ситуацию, описанную в пункте 5.
  7. Идея реализации: для одного и того же запроса с одинаковыми параметрами разрешаем только один успешный запрос в течение времени expireTime.
  8. Для страниц следует использовать маскировку, а также рассмотреть возможность использования уникальных индексов в базе данных.
  9. Эта аннотация предназначена только для обеспечения идемпотентности и не используется для блокировки. В сценариях с большим количеством одновременных запросов (например, 100 параллельных запросов) могут возникнуть проблемы, и это не имеет смысла. На практике пользователи вряд ли будут отправлять несколько десятков или сотен повторяющихся запросов в течение 1–3 секунд, или отправлять 100 повторяющихся запросов при слабом соединении.

2. Использование

    1. Импорт зависимостей | Версия | Поддержка | |-------|--| | 0.4.0 | Совместимость с SpringBoot 3.x | | 0.1.0 | Совместимость с SpringBoot 2.x |
<dependency>
    <groupId>com.pig4cloud.plugin</groupId>
    <artifactId>idempotent-spring-boot-starter</artifactId>
    <version>0.4.0</version>
</dependency>

Использование снимка

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

<repositories>
  <repository>
      <id>snapshots</id>
      <name>Excel Snapshots</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
      <releases>
          <enabled>false</enabled>
      </releases>
  </repository>
</repositories> 
    1. Настройка соединения с Redis
spring:
  redis:
    host: 127.0.0.1
    port: 6379

Теоретически поддерживается вся конфигурация redisson-spring-boot-starter.

    1. Применение аннотации idempotent к интерфейсам
@Idempotent(key = "#demo.username", expireTime = 3, info = "请勿重复查询")
@GetMapping("/test")
public String test(Demo demo) {
    return "success";
}

Описание параметров аннотации idempotent

    1. Уникальный идентификатор операции идемпотента, использующий выражение Spring EL с символом # для ссылки на параметры метода. Если пусто, используется текущий URL + аргументы.
String key();
    1. Срок действия по умолчанию равен 1, который должен превышать время выполнения программы, иначе запросы всё равно могут поступать.
	int expireTime() default 1;
    1. Единица времени по умолчанию — секунды (s).
TimeUnit timeUnit() default TimeUnit.SECONDS;
    1. Информация о неудаче идемпотентной операции, которую можно настроить.
String info() default "Повторяющийся запрос, пожалуйста, повторите попытку позже";
    1. Следует ли удалять ключ после завершения бизнес-операции: true — удалить, false — не удалять.
boolean delKey() default false;

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

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

1
https://api.gitlife.ru/oschina-mirror/log4j-idempotent-spring-boot-starter.git
git@api.gitlife.ru:oschina-mirror/log4j-idempotent-spring-boot-starter.git
oschina-mirror
log4j-idempotent-spring-boot-starter
log4j-idempotent-spring-boot-starter
master