Comment configurer Shed Lock pour les systèmes à haute disponibilité ?

Jan 12, 2026

Laisser un message

John Lee
John Lee
Je suis le directeur de la technologie de Hunan Lianhu Hardware Co., stimulant notre stratégie d'innovation. Je me concentre sur le développement de solutions matérielles de pointe qui répondent aux demandes modernes.

Dans le domaine des systèmes à haute disponibilité, il est de la plus haute importance de garantir que certaines tâches critiques sont exécutées avec une synchronisation appropriée et sans conditions de concurrence. C’est là que Shed Lock entre en jeu. En tant que fournisseur Shed Lock, je suis là pour vous guider tout au long du processus de configuration de Shed Lock pour les environnements à haute disponibilité.

Comprendre le verrouillage du hangar

Shed Lock est une bibliothèque qui fournit des verrous distribués pour les tâches planifiées dans les applications Java. Dans les systèmes à haute disponibilité, plusieurs instances d'une application peuvent tenter d'exécuter simultanément la même tâche planifiée. Cela peut entraîner des problèmes d’intégrité des données, des traitements en double et d’autres problèmes. Shed Lock résout ce problème en utilisant un stockage partagé (tel qu'une base de données) pour gérer les verrous. Une seule instance peut acquérir le verrou à la fois, garantissant ainsi que la tâche n'est exécutée qu'une seule fois.

Conditions préalables

Avant de commencer à configurer Shed Lock, assurez-vous d'avoir les éléments suivants :

  • Une application Java exécutée sur une infrastructure à haute disponibilité. Il peut s'agir d'un ensemble de serveurs dans un cluster, déployés dans un environnement cloud comme AWS ou Google Cloud.
  • Une base de données pouvant être utilisée comme stockage partagé pour les serrures. Les choix populaires incluent MySQL, PostgreSQL et H2.
  • Maven ou Gradle configuré pour gérer les dépendances.

Étape 1 : ajouter des dépendances

La première étape consiste à ajouter les dépendances Shed Lock à votre projet. Si vous utilisez Maven, ajoutez ce qui suit à votrepom.xml:

<dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.42.0</version> </dependency> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.42.0</version> </dependency>

Pour Gradle, ajoutez ces lignes à votrebuild.gradle:

implémentation 'net.javacrumbs.shedlock:shedlock-spring:4.42.0' implémentation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0'

Étape 2 : configurer le fournisseur de verrouillage

Le fournisseur de verrous est chargé d'interagir avec le stockage partagé (la base de données dans notre cas) pour gérer les verrous. Voici un exemple de configuration d'un fournisseur de verrous à l'aide de Spring.Modèle Jdbc:

importer net.javacrumbs.shedlock.core.LockProvider ; importer net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider ; importer org.springframework.context.annotation.Bean ; importer org.springframework.context.annotation.Configuration ; importer org.springframework.jdbc.core.JdbcTemplate ; importer javax.sql.DataSource ; @Configuration public class ShedLockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withJdbcTemplate(new JdbcTemplate(dataSource)) .usingDbTime() .build() ); } }

Dans cet exemple, nous créons unJdbcTemplateLockProviderbean qui utilise leSource de donnéespour interagir avec la base de données. Leen utilisantDbTime()La méthode indique que nous souhaitons utiliser l’heure système de la base de données pour la gestion des verrous.

Étape 3 : Configurer Shed Lock au printemps

Ensuite, nous devons activer Shed Lock dans notre application Spring. Nous pouvons le faire en ajoutant le@EnableSchedulerLockannotation à notre classe de configuration principale :

importer net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock ; importer org.springframework.context.annotation.Configuration ; importer org.springframework.scheduling.annotation.EnableScheduling ; @Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") classe publique AppConfig { // Code de configuration ici }

Le@EnableSchedulingl'annotation active les capacités de planification de Spring, et@EnableSchedulerLockactive le verrouillage du hangar. LedefaultLockAtMostForL'attribut spécifie la durée maximale pendant laquelle un verrou peut être maintenu. Dans ce cas, le verrou sera automatiquement déverrouillé après 30 secondes.

Étape 4 : appliquer des verrous aux tâches planifiées

Désormais, nous pouvons appliquer des verrous à nos tâches planifiées. Voici un exemple :

importer net.javacrumbs.shedlock.spring.annotation.SchedulerLock ; importer org.springframework.scheduling.annotation.Scheduled ; importer org.springframework.stereotype.Service ; @Service public class ScheduledTaskService { @Scheduled(fixedRate = 60000) @SchedulerLock(name = "myScheduledTask", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M") public void myScheduledTask() { // Logique de tâche ici System.out.println("Exécution de la tâche planifiée..."); } }

Le@SchedulerLockL'annotation est utilisée pour appliquer un verrou aumaTâche Planifiéeméthode. LenomL'attribut est un identifiant unique pour le verrou. LelockAtMostForL'attribut spécifie la durée maximale pendant laquelle le verrou peut être maintenu, etverrouillerAuMoinsPourspécifie la durée minimale pendant laquelle le verrou sera maintenu.

Étape 5 : configuration de la base de données

Nous devons créer une table dans la base de données pour stocker les informations de verrouillage. Pour une base de données MySQL, l'instruction SQL pour créer la table est la suivante :

CREATE TABLE shedlock( nom VARCHAR(64) NON NULL, lock_until TIMESTAMP(3) NON NULL, verrouillé_à TIMESTAMP(3) NON NULL, verrouillé_par VARCHAR(255) NON NULL, CLÉ PRIMAIRE (nom) );

Pour d'autres bases de données comme PostgreSQL, l'instruction SQL est similaire, mais les types de données devront peut-être être ajustés en fonction des spécifications de la base de données.

Considérations supplémentaires pour la haute disponibilité

Dans les systèmes à haute disponibilité, nous devons prendre en compte quelques facteurs supplémentaires :

  • Réplication de base de données: Si vous utilisez une base de données répliquée, assurez-vous que la table de verrouillage est correctement répliquée. Tout retard dans la réplication peut conduire plusieurs instances à acquérir le verrou simultanément.
  • Latence du réseau: Une latence réseau élevée entre les instances d'application et la base de données peut affecter l'acquisition et la libération du verrou. Pensez à utiliser une base de données géographiquement proche de vos serveurs d'applications.
  • Récupération d'échec: Mettre en œuvre des mécanismes de récupération après panne appropriés. Si une instance échoue alors qu'elle détient un verrou, le verrou doit être libéré automatiquement après lalockAtMostForle temps est écoulé.

Liens sur les produits associés

Si vous recherchez des serrures de haute qualité pour d'autres applications, vous pourriez être intéressé par notreVerrouillage par poussée,Serrure de porte en bois, etSerrure de porte ronde.

Contactez-nous pour l'approvisionnement

Nous comprenons l'importance de solutions de verrouillage fiables dans les systèmes à haute disponibilité. En tant que fournisseur Shed Lock, nous nous engageons à vous fournir les meilleurs produits et le meilleur support. Si vous souhaitez acquérir Shed Lock pour vos projets à haute disponibilité ou si vous avez des questions sur sa configuration, nous vous encourageons à nous contacter. Entamez une conversation avec nous pour discuter de vos besoins spécifiques et découvrez comment notre Shed Lock peut améliorer les performances et la fiabilité de vos systèmes.

19-61-5

Références

  • Documentation officielle de Shed Lock, "https://www.javacrumbs.net/shedlock/"
  • Documentation Spring Framework, "https://docs.spring.io/spring-framework/docs/current/reference/html/"
Envoyez demande