Eyni servisin çoxlu nüsxəsindən yalnız birini Lider seçərək bəzi işləri (Cron, Batch) yalnız onun etməsini təmin etmək.
3 nüsxə var, amma SMS göndərmə cron-u yalnız 1 nüsxə işlətməlidir. Əks halda istifadəçiyə 3 eyni SMS gedər!
Redis/ZooKeeper vasitəsilə yalnız bir nüsxə lock alır və Lider olur. Digərləri Follower qalır, gözləyir.
Redis (Redisson Lock), ZooKeeper, etcd, ShedLock (Spring), Kubernetes Leader Election.
// ShedLock ilə — yalnız 1 instance lock alır və işi görür
@Component
public class ScheduledTasks {
@Scheduled(cron = "0 0 0 * * *") // Hər gecə 00:00
@SchedulerLock(
name = "sendDailySms",
lockAtMostFor = "PT30M", // Maks 30 dəq lock saxla
lockAtLeastFor = "PT5M" // Min 5 dəq lock saxla
)
public void sendDailySms() {
// Bu kod yalnız 1 instance-da icra olunur!
// Digər 2 nüsxə lock ala bilmir → skip edir
smsService.sendDailyNotifications();
}
}
// Redis-dən lock alan provider
@Bean
public LockProvider lockProvider(RedisConnectionFactory conn) {
return new RedisLockProvider(conn);
}