Nel campo dei sistemi ad alta disponibilità, garantire che determinate attività critiche vengano eseguite con la corretta sincronizzazione e senza condizioni di competizione è della massima importanza. È qui che entra in gioco Shed Lock. In qualità di fornitore di Shed Lock, sono qui per guidarti attraverso il processo di configurazione di Shed Lock per ambienti ad alta disponibilità.
Comprendere il blocco del capannone
Shed Lock è una libreria che fornisce blocchi distribuiti per attività pianificate nelle applicazioni Java. Nei sistemi ad alta disponibilità, più istanze di un'applicazione possono tentare di eseguire simultaneamente la stessa attività pianificata. Ciò può portare a problemi di integrità dei dati, elaborazione duplicata e altri problemi. Shed Lock risolve questo problema utilizzando uno spazio di archiviazione condiviso (come un database) per gestire le serrature. Solo un'istanza alla volta può acquisire il blocco, garantendo che l'attività venga eseguita una sola volta.
Prerequisiti
Prima di iniziare a configurare Shed Lock, assicurati di avere quanto segue:
- Un'applicazione Java in esecuzione su un'infrastruttura ad alta disponibilità. Potrebbe trattarsi di un insieme di server in un cluster, distribuito in un ambiente cloud come AWS o Google Cloud.
- Un database che può essere utilizzato come archivio condiviso per le serrature. Le scelte più popolari includono MySQL, PostgreSQL e H2.
- Maven o Gradle configurato per gestire le dipendenze.
Passaggio 1: aggiungi dipendenze
Il primo passo è aggiungere le dipendenze di Shed Lock al tuo progetto. Se usi Maven, aggiungi quanto segue al tuo filepom.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>
Per Gradle, aggiungi queste righe al tuo filebuild.gradle:
implementazione 'net.javacrumbs.shedlock:shedlock-spring:4.42.0' implementazione 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0'
Passaggio 2: configura il provider di blocco
Il provider del lock è responsabile dell'interazione con lo spazio di archiviazione condiviso (il database nel nostro caso) per gestire i lock. Ecco un esempio di come configurare un provider di blocco utilizzando Spring'sModello Jdbc:
importa net.javacrumbs.shedlock.core.LockProvider; importa net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; importa org.springframework.jdbc.core.JdbcTemplate; importare 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 questo esempio creiamo un fileJdbcTemplateLockProviderbean che utilizza il bean fornitoDataSourceper interagire con il database. ILutilizzando DbTime()Il metodo indica che vogliamo utilizzare l'ora di sistema del database per la gestione dei blocchi.
Passaggio 3: configura Shed Lock in primavera
Successivamente, dobbiamo abilitare Shed Lock nella nostra applicazione Spring. Possiamo farlo aggiungendo il@EnableSchedulerLockannotazione alla nostra classe di configurazione principale:
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") classe pubblica AppConfig { // Codice di configurazione qui }
IL@EnableSchedulingl'annotazione abilita le funzionalità di pianificazione di Spring e@EnableSchedulerLockabilita il blocco del capannone. ILdefaultLockAtMostForL'attributo specifica il tempo massimo in cui un blocco può essere mantenuto. In questo caso il blocco verrà rilasciato automaticamente dopo 30 secondi.
Passaggio 4: applica i blocchi alle attività pianificate
Ora possiamo applicare blocchi alle nostre attività pianificate. Ecco un esempio:
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; importare org.springframework.stereotype.Service; @Service public class ScheduledTaskService { @Scheduled(fixedRate = 60000) @SchedulerLock(name = "myScheduledTask", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M") public void myScheduledTask() { // Logica dell'attività qui System.out.println("Esecuzione dell'attività pianificata..."); } }
IL@SchedulerLockl'annotazione viene utilizzata per applicare un blocco al filemyScheduledTaskmetodo. ILnomeL'attributo è un identificatore univoco per la serratura. ILlockAtMostForL'attributo specifica il tempo massimo in cui il blocco può essere mantenuto elockAlmenoPerspecifica il tempo minimo in cui verrà mantenuto il blocco.
Passaggio 5: impostazione del database
Dobbiamo creare una tabella nel database per memorizzare le informazioni sul blocco. Per un database MySQL, l'istruzione SQL per creare la tabella è la seguente:
CREATE TABLE shedlock( nome VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL, bloccato_at TIMESTAMP(3) NOT NULL, bloccato_da VARCHAR(255) NOT NULL, PRIMARY KEY (nome) );
Per altri database come PostgreSQL, l'istruzione SQL è simile, ma potrebbe essere necessario modificare i tipi di dati in base alle specifiche del database.
Considerazioni aggiuntive per la disponibilità elevata
Nei sistemi ad alta disponibilità, dobbiamo considerare alcuni fattori aggiuntivi:
- Replica della banca dati: se utilizzi un database replicato, assicurati che la tabella di blocco sia replicata correttamente. Qualsiasi ritardo nella replica può portare più istanze ad acquisire il blocco contemporaneamente.
- Latenza di rete: un'elevata latenza di rete tra le istanze dell'applicazione e il database può influire sull'acquisizione e sul rilascio del blocco. Prendi in considerazione l'utilizzo di un database geograficamente vicino ai server delle applicazioni.
- Recupero da guasti: Implementare adeguati meccanismi di ripristino in caso di errore. Se un'istanza fallisce mentre mantiene un blocco, il blocco dovrebbe essere rilasciato automaticamente dopo il
lockAtMostForil tempo è trascorso.
Collegamenti ai prodotti correlati
Se stai cercando serrature di alta qualità per altre applicazioni, potrebbero interessarti le nostrePremere il blocco,Serratura per porta in legno, ESerratura per porta rotonda.
Contattaci per l'approvvigionamento
Comprendiamo l'importanza di soluzioni di blocco affidabili nei sistemi ad alta disponibilità. In qualità di fornitore di Shed Lock, ci impegniamo a fornirti i migliori prodotti e supporto. Se sei interessato a procurarti Shed Lock per i tuoi progetti ad alta disponibilità o hai domande sulla sua configurazione, ti invitiamo a contattarci. Inizia una conversazione con noi per discutere delle tue esigenze specifiche ed esplorare come il nostro Shed Lock può migliorare le prestazioni e l'affidabilità dei tuoi sistemi.


Riferimenti
- Documentazione ufficiale di Shed Lock, "https://www.javacrumbs.net/shedlock/"
- Documentazione di Spring Framework, "https://docs.spring.io/spring-framework/docs/current/reference/html/"
