Цель: при горизонтальном масштабировании фоновые задачи (снятие протухших резервов, периодический пересчёт low-stock) должны выполняться ровно на одном инстансе, а не на каждом.
Зависимость: — (эффективен при >1 реплики, см. OPS-6).
Что сделать
- Подключить ShedLock (
shedlock-spring + провайдер: JDBC или Redis), включить @EnableSchedulerLock(defaultLockAtMostFor = "PT5M").
- Создать минимум одну реальную
@Scheduled джобу (например, пересчёт списка low-stock или снятие протухших резервов) и навесить:
@Scheduled(cron = "0 */5 * * * *")
@SchedulerLock(name = "recalcLowStock", lockAtLeastFor = "PT1M", lockAtMostFor = "PT4M")
void recalc() { ... }
- Для JDBC-провайдера — миграция таблицы
shedlock(name, lock_until, locked_at, locked_by).
- Стретч: продумать идемпотентность джобы (повторный прогон не ломает данные) и leader-only выполнение. НЕ давать готовую джобу целиком — только каркас и места блокировки.
Acceptance criteria
Цель: при горизонтальном масштабировании фоновые задачи (снятие протухших резервов, периодический пересчёт low-stock) должны выполняться ровно на одном инстансе, а не на каждом.
Зависимость: — (эффективен при >1 реплики, см. OPS-6).
Что сделать
shedlock-spring+ провайдер: JDBC или Redis), включить@EnableSchedulerLock(defaultLockAtMostFor = "PT5M").@Scheduledджобу (например, пересчёт списка low-stock или снятие протухших резервов) и навесить:shedlock(name, lock_until, locked_at, locked_by).Acceptance criteria
locked_by).lock_until.lockAtMostFor.