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

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

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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

Это рефакторинг существующего кода 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 )

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

Введение

Описание недоступно Развернуть Свернуть
Apache-2.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