W dziedzinie systemów o wysokiej dostępności zapewnienie realizacji niektórych krytycznych zadań z odpowiednią synchronizacją i bez warunków wyścigowych jest sprawą najwyższej wagi. Tutaj właśnie wchodzi w grę Shed Lock. Jako dostawca Shed Lock jestem tutaj, aby poprowadzić Cię przez proces konfiguracji Shed Lock dla środowisk o wysokiej dostępności.
Zrozumienie blokady szopy
Shed Lock to biblioteka udostępniająca rozproszone blokady zaplanowanych zadań w aplikacjach Java. W systemach o wysokiej dostępności wiele instancji aplikacji może próbować wykonać to samo zaplanowane zadanie jednocześnie. Może to prowadzić do problemów z integralnością danych, duplikowania przetwarzania i innych problemów. Shed Lock rozwiązuje ten problem, wykorzystując współdzieloną pamięć (taką jak baza danych) do zarządzania blokadami. Tylko jedna instancja może uzyskać blokadę na raz, zapewniając wykonanie zadania tylko raz.
Warunki wstępne
Zanim zaczniemy konfigurować Shed Lock, upewnij się, że masz następujące elementy:
- Aplikacja Java działająca w infrastrukturze o wysokiej dostępności. Może to być zestaw serwerów w klastrze wdrożonym w środowisku chmurowym, takim jak AWS lub Google Cloud.
- Baza danych, która może służyć jako współdzielony magazyn zamków. Popularne opcje obejmują MySQL, PostgreSQL i H2.
- Maven lub Gradle skonfigurowany do zarządzania zależnościami.
Krok 1: Dodaj zależności
Pierwszym krokiem jest dodanie zależności Shed Lock do projektu. Jeśli używasz Mavena, dodaj następujące elementy do plikupom.xml:
<dependentency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.42.0</version> </dependent> <dependenty> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.42.0</version> </dependent>
W przypadku Gradle dodaj te linie do plikukompilacja.gradle:
implementacja „net.javacrumbs.shedlock:shedlock-spring:4.42.0” implementacja „net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0”
Krok 2: Skonfiguruj dostawcę blokady
Dostawca blokad jest odpowiedzialny za interakcję ze współdzieloną pamięcią (w naszym przypadku bazą danych) w celu zarządzania blokadami. Oto przykład konfiguracji dostawcy blokady przy użyciu SpringaSzablon Jdbc:
importuj net.javacrumbs.shedlock.core.LockProvider; importuj 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; importuj javax.sql.DataSource; @Configuration public class ShedLockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { zwróć nowy JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withJdbcTemplate(nowy JdbcTemplate(dataSource)) .usingDbTime() .build() ); } }
W tym przykładzie tworzymy plikDostawca JdbcTemplateLockfasola, która korzysta z dostarczonegoŹródło danychdo interakcji z bazą danych. TheusingDbTime()wskazuje, że chcemy wykorzystać czas systemowy bazy danych do zarządzania blokadami.
Krok 3: Skonfiguruj blokadę szopy na wiosnę
Następnie musimy włączyć Shed Lock w naszej aplikacji Spring. Możemy to zrobić dodając@EnableSchedulerLockadnotacja do naszej głównej klasy konfiguracyjnej:
importuj net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") klasa publiczna AppConfig { // Tutaj kod konfiguracji }
The@Włącz planowanieadnotacja umożliwia planowanie Springa, oraz@EnableSchedulerLockwłącza blokadę szopy. ThedefaultLockAtMostForatrybut określa maksymalny czas utrzymywania blokady. W takim przypadku blokada zostanie automatycznie zwolniona po 30 sekundach.
Krok 4: Zastosuj blokady do zaplanowanych zadań
Teraz możemy zastosować blokady do zaplanowanych zadań. Oto przykład:
importuj net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service klasa publiczna ScheduledTaskService { @Scheduled(fixedRate = 60000) @SchedulerLock(name = "myScheduledTask", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M") public void myScheduledTask() { // Tutaj logika zadania System.out.println("Wykonywanie zaplanowanego zadania..."); } }
The@SchedulerLockadnotacja służy do nakładania blokady na plikmojeZaplanowaneZadaniemetoda. Thenazwaatrybut jest unikalnym identyfikatorem zamka. ThezablokujAtMostForatrybut określa maksymalny czas, przez jaki można utrzymać blokadę, orazzablokuj przynajmniej dlaokreśla minimalny czas utrzymywania blokady.
Krok 5: Konfiguracja bazy danych
Musimy utworzyć tabelę w bazie danych, aby przechowywać informacje o blokadzie. W przypadku bazy danych MySQL instrukcja SQL tworząca tabelę wygląda następująco:
UTWÓRZ TABELĘ shedlock(nazwa VARCHAR(64) NIE NULL, lock_until TIMESTAMP(3) NIE NULL, zablokowana_w TIMESTAMP(3) NIE NULL, zablokowana_by VARCHAR(255) NIE NULL, KLUCZ PODSTAWOWY (nazwa) );
W przypadku innych baz danych, takich jak PostgreSQL, instrukcja SQL jest podobna, ale typy danych mogą wymagać dostosowania zgodnie ze specyfikacjami bazy danych.
Dodatkowe uwagi dotyczące wysokiej dostępności
W systemach o wysokiej dostępności musimy wziąć pod uwagę kilka dodatkowych czynników:
- Replikacja bazy danych: Jeśli używasz zreplikowanej bazy danych, upewnij się, że tabela blokująca jest poprawnie zreplikowana. Każde opóźnienie w replikacji może prowadzić do jednoczesnego uzyskania blokady przez wiele instancji.
- Opóźnienie sieci: Duże opóźnienia sieciowe między instancjami aplikacji a bazą danych mogą mieć wpływ na uzyskanie i zwolnienie blokady. Rozważ użycie bazy danych znajdującej się geograficznie blisko serwerów aplikacji.
- Odzyskiwanie po awarii: Wdrożyć odpowiednie mechanizmy odzyskiwania po awarii. Jeśli instancja nie powiedzie się podczas utrzymywania blokady, blokada powinna zostać automatycznie zwolniona po
zablokujAtMostForczas upłynął.
Powiązane linki do produktów
Jeśli szukasz wysokiej jakości zamków do innych zastosowań, być może zainteresują Cię naszeNaciśnij blokadę,Drewniany zamek do drzwi, IOkrągły zamek do drzwi.
Skontaktuj się z nami w sprawie zakupów
Rozumiemy znaczenie niezawodnych rozwiązań zamkowych w systemach o wysokiej dostępności. Jako dostawca zamków do szopy dokładamy wszelkich starań, aby zapewnić najlepsze produkty i wsparcie. Jeśli jesteś zainteresowany zakupem Shed Lock do swoich projektów o wysokiej dostępności lub masz pytania dotyczące jego konfiguracji, zachęcamy do kontaktu. Rozpocznij z nami rozmowę, aby omówić swoje specyficzne potrzeby i dowiedzieć się, w jaki sposób nasza blokada szopy może zwiększyć wydajność i niezawodność Twoich systemów.


Referencje
- Oficjalna dokumentacja Shed Lock, „https://www.javacrumbs.net/shedlock/”
- Dokumentacja Spring Framework, „https://docs.spring.io/spring-framework/docs/current/reference/html/”
