Im Bereich der Hochverfügbarkeitssysteme ist es von größter Bedeutung, sicherzustellen, dass bestimmte kritische Aufgaben mit ordnungsgemäßer Synchronisierung und ohne Race Conditions ausgeführt werden. Hier kommt Shed Lock ins Spiel. Als Shed Lock-Anbieter bin ich hier, um Sie durch den Prozess der Konfiguration von Shed Lock für Hochverfügbarkeitsumgebungen zu führen.
Schuppensperre verstehen
Shed Lock ist eine Bibliothek, die verteilte Sperren für geplante Aufgaben in Java-Anwendungen bereitstellt. In Hochverfügbarkeitssystemen versuchen möglicherweise mehrere Instanzen einer Anwendung, dieselbe geplante Aufgabe gleichzeitig auszuführen. Dies kann zu Problemen mit der Datenintegrität, doppelter Verarbeitung und anderen Problemen führen. Shed Lock löst dieses Problem, indem es einen gemeinsam genutzten Speicher (z. B. eine Datenbank) zur Verwaltung von Sperren verwendet. Es kann jeweils nur eine Instanz die Sperre erwerben, wodurch sichergestellt wird, dass die Aufgabe nur einmal ausgeführt wird.
Voraussetzungen
Bevor wir mit der Konfiguration von Shed Lock beginnen, stellen Sie sicher, dass Sie über Folgendes verfügen:
- Eine Java-Anwendung, die auf einer Hochverfügbarkeitsinfrastruktur ausgeführt wird. Dabei kann es sich um eine Reihe von Servern in einem Cluster handeln, die in einer Cloud-Umgebung wie AWS oder Google Cloud bereitgestellt werden.
- Eine Datenbank, die als gemeinsamer Speicher für die Schlösser verwendet werden kann. Beliebte Optionen sind MySQL, PostgreSQL und H2.
- Maven oder Gradle sind für die Verwaltung von Abhängigkeiten konfiguriert.
Schritt 1: Abhängigkeiten hinzufügen
Der erste Schritt besteht darin, die Shed Lock-Abhängigkeiten zu Ihrem Projekt hinzuzufügen. Wenn Sie Maven verwenden, fügen Sie Folgendes zu Ihrem hinzupom.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>
Fügen Sie für Gradle diese Zeilen zu Ihrem hinzubuild.gradle:
Implementierung 'net.javacrumbs.shedlock:shedlock-spring:4.42.0' Implementierung 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0'
Schritt 2: Konfigurieren Sie den Sperranbieter
Der Sperranbieter ist für die Interaktion mit dem gemeinsam genutzten Speicher (in unserem Fall der Datenbank) verantwortlich, um Sperren zu verwalten. Hier ist ein Beispiel für die Konfiguration eines Sperranbieters mithilfe von SpringJdbcTemplate:
import net.javacrumbs.shedlock.core.LockProvider; import net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import 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() ); } }
In diesem Beispiel erstellen wir eineJdbcTemplateLockProviderBean, die die bereitgestellte verwendetDatenquelleum mit der Datenbank zu interagieren. DerusingDbTime()Die Methode gibt an, dass wir die Systemzeit der Datenbank für die Sperrverwaltung verwenden möchten.
Schritt 3: Konfigurieren Sie die Schuppensperre im Frühjahr
Als nächstes müssen wir Shed Lock in unserer Spring-Anwendung aktivieren. Wir können dies tun, indem wir Folgendes hinzufügen@EnableSchedulerLockAnmerkung zu unserer Hauptkonfigurationsklasse:
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") öffentliche Klasse AppConfig { // Konfigurationscode hier }
Der@EnableSchedulingAnnotation ermöglicht die Planungsfunktionen von Spring und@EnableSchedulerLockaktiviert Schuppensperre. DerdefaultLockAtMostForDas Attribut gibt die maximale Zeit an, die eine Sperre gehalten werden kann. In diesem Fall wird die Sperre nach 30 Sekunden automatisch aufgehoben.
Schritt 4: Sperren auf geplante Aufgaben anwenden
Jetzt können wir Sperren auf unsere geplanten Aufgaben anwenden. Hier ist ein Beispiel:
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service public class ScheduledTaskService { @Scheduled(fixedRate = 60000) @SchedulerLock(name = "myScheduledTask", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M") public void myScheduledTask() { // Aufgabenlogik hier System.out.println("Geplante Aufgabe wird ausgeführt..."); } }
Der@SchedulerLockAnnotation wird verwendet, um eine Sperre auf die anzuwendenmyScheduledTaskVerfahren. DerNameDas Attribut ist eine eindeutige Kennung für die Sperre. DerlockAtMostForDas Attribut gibt die maximale Zeit an, die die Sperre gehalten werden kannlockAtLeastForGibt die Mindestdauer an, die die Sperre gehalten wird.
Schritt 5: Datenbank-Setup
Wir müssen eine Tabelle in der Datenbank erstellen, um Sperrinformationen zu speichern. Für eine MySQL-Datenbank lautet die SQL-Anweisung zum Erstellen der Tabelle wie folgt:
CREATE TABLE shedlock( name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL, Locked_at TIMESTAMP(3) NOT NULL, Locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (Name) );
Für andere Datenbanken wie PostgreSQL ist die SQL-Anweisung ähnlich, die Datentypen müssen jedoch möglicherweise entsprechend den Spezifikationen der Datenbank angepasst werden.
Zusätzliche Überlegungen zur Hochverfügbarkeit
In Hochverfügbarkeitssystemen müssen wir einige zusätzliche Faktoren berücksichtigen:
- Datenbankreplikation: Wenn Sie eine replizierte Datenbank verwenden, stellen Sie sicher, dass die Sperrtabelle korrekt repliziert wird. Jede Verzögerung bei der Replikation kann dazu führen, dass mehrere Instanzen gleichzeitig die Sperre erhalten.
- Netzwerklatenz: Eine hohe Netzwerklatenz zwischen den Anwendungsinstanzen und der Datenbank kann sich auf den Erwerb und die Freigabe von Sperren auswirken. Erwägen Sie die Verwendung einer Datenbank, die sich geografisch in der Nähe Ihrer Anwendungsserver befindet.
- Wiederherstellung nach Fehlern: Implementieren Sie geeignete Mechanismen zur Wiederherstellung nach Fehlern. Wenn eine Instanz fehlschlägt, während eine Sperre gehalten wird, sollte die Sperre nach dem automatischen Aufheben der Sperre aufgehoben werden
lockAtMostForZeit ist vergangen.
Verwandte Produktlinks
Wenn Sie auf der Suche nach hochwertigen Schlössern für andere Anwendungen sind, könnten Sie an unserem interessiert seinPush-Lock,Türschloss aus Holz, UndRundes Türschloss.
Kontaktieren Sie uns für die Beschaffung
Wir wissen, wie wichtig zuverlässige Schließlösungen in Hochverfügbarkeitssystemen sind. Als Lieferant von Schuppenschlössern sind wir bestrebt, Ihnen die besten Produkte und den besten Support zu bieten. Wenn Sie an der Anschaffung von Shed Lock für Ihre Hochverfügbarkeitsprojekte interessiert sind oder Fragen zur Konfiguration haben, empfehlen wir Ihnen, sich an uns zu wenden. Beginnen Sie ein Gespräch mit uns, um Ihre spezifischen Anforderungen zu besprechen und herauszufinden, wie unser Schuppenschloss die Leistung und Zuverlässigkeit Ihrer Systeme verbessern kann.


Referenzen
- Offizielle Dokumentation von Shed Lock, „https://www.javacrumbs.net/shedlock/“
- Spring Framework-Dokumentation, „https://docs.spring.io/spring-framework/docs/current/reference/html/“
