고가용성 시스템 영역에서는 경쟁 조건 없이 적절한 동기화를 통해 특정 중요한 작업이 실행되도록 하는 것이 가장 중요합니다. 이곳이 Shed Lock이 작동하는 곳입니다. 저는 창고 잠금 장치 공급업체로서 고가용성 환경에 맞게 창고 잠금 장치를 구성하는 과정을 안내해 드리고자 왔습니다.
창고 잠금 이해
Shed Lock은 Java 애플리케이션의 예약된 작업에 대한 분산 잠금을 제공하는 라이브러리입니다. 고가용성 시스템에서는 애플리케이션의 여러 인스턴스가 동일한 예약된 작업을 동시에 실행하려고 시도할 수 있습니다. 이로 인해 데이터 무결성 문제, 중복 처리 및 기타 문제가 발생할 수 있습니다. Shed Lock은 공유 저장소(예: 데이터베이스)를 사용하여 잠금을 관리함으로써 이 문제를 해결합니다. 한 번에 하나의 인스턴스만 잠금을 획득할 수 있으므로 작업이 한 번만 실행됩니다.
전제조건
Shed Lock 구성을 시작하기 전에 다음 사항이 있는지 확인하세요.
- 고가용성 인프라에서 실행되는 Java 애플리케이션입니다. 이는 AWS 또는 Google Cloud와 같은 클라우드 환경에 배포된 클러스터의 서버 집합일 수 있습니다.
- 잠금을 위한 공유 스토리지로 사용할 수 있는 데이터베이스입니다. 인기 있는 선택에는 MySQL, PostgreSQL 및 H2가 있습니다.
- 종속성을 관리하도록 구성된 Maven 또는 Gradle.
1단계: 종속성 추가
첫 번째 단계는 프로젝트에 Shed Lock 종속성을 추가하는 것입니다. Maven을 사용하는 경우 다음을 추가하십시오.pom.xml:
<종속성> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.42.0</version> </dependent> <종속성> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.42.0</version> </종속성>
Gradle의 경우 다음 줄을build.gradle:
구현 'net.javacrumbs.shedlock:shedlock-spring:4.42.0' 구현 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0'
2단계: 잠금 공급자 구성
잠금 공급자는 공유 저장소(이 경우 데이터베이스)와 상호 작용하여 잠금을 관리하는 일을 담당합니다. 다음은 Spring을 사용하여 잠금 공급자를 구성하는 방법에 대한 예입니다.Jdbc템플릿:
수입 net.javacrums.shedlock.core.LockProvider; import net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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() ); } }
이 예에서는JdbcTemplateLockProvider제공된 Bean을 사용하는 Bean데이터 소스데이터베이스와 상호 작용합니다. 그만큼DbTime()을 사용하여메소드는 잠금 관리를 위해 데이터베이스의 시스템 시간을 사용하려고 함을 나타냅니다.
3단계: 봄에 창고 잠금 구성
다음으로 Spring 애플리케이션에서 Shed Lock을 활성화해야 합니다. 우리는 다음을 추가하여 이를 수행할 수 있습니다.@EnableSchedulerLock기본 구성 클래스에 대한 주석:
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class AppConfig { // 여기에 구성 코드 }
그만큼@EnableScheduling주석은 Spring의 스케줄링 기능을 활성화합니다.@EnableSchedulerLock창고 잠금을 활성화합니다. 그만큼defaultLockAtMostFor속성은 잠금을 유지할 수 있는 최대 시간을 지정합니다. 이 경우 30초 후에 자동으로 잠금이 해제됩니다.
4단계: 예약된 작업에 잠금 적용
이제 예약된 작업에 잠금을 적용할 수 있습니다. 예는 다음과 같습니다.
수입 net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; org.springframework.stereotype.Service 가져오기; @Service public class ScheduledTaskService { @Scheduled(fixedRate = 60000) @SchedulerLock(name = "myScheduledTask", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M") public void myScheduledTask() { // 여기에 작업 논리 System.out.println("예약된 작업 실행 중..."); } }
그만큼@SchedulerLock주석은 잠금을 적용하는 데 사용됩니다.myScheduledTask방법. 그만큼이름속성은 잠금의 고유 식별자입니다. 그만큼최대 잠금속성은 잠금을 유지할 수 있는 최대 시간을 지정합니다.잠금: 최소:잠금이 유지되는 최소 시간을 지정합니다.
5단계: 데이터베이스 설정
잠금 정보를 저장하려면 데이터베이스에 테이블을 만들어야 합니다. MySQL 데이터베이스의 경우 테이블을 생성하는 SQL 문은 다음과 같습니다.
CREATE TABLE shedlock( 이름 VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL, 잠긴_at TIMESTAMP(3) NOT NULL, 잠긴_by VARCHAR(255) NOT NULL, PRIMARY KEY(이름) );
PostgreSQL과 같은 다른 데이터베이스의 경우 SQL 문은 유사하지만 데이터베이스 사양에 따라 데이터 유형을 조정해야 할 수 있습니다.
고가용성을 위한 추가 고려 사항
고가용성 시스템에서는 다음과 같은 몇 가지 추가 요소를 고려해야 합니다.
- 데이터베이스 복제: 복제된 데이터베이스를 사용하는 경우 잠금 테이블이 올바르게 복제되었는지 확인하세요. 복제가 지연되면 여러 인스턴스가 동시에 잠금을 획득할 수 있습니다.
- 네트워크 대기 시간: 애플리케이션 인스턴스와 데이터베이스 간의 높은 네트워크 대기 시간은 잠금 획득 및 해제에 영향을 미칠 수 있습니다. 애플리케이션 서버와 지리적으로 가까운 데이터베이스를 사용하는 것을 고려하십시오.
- 장애 복구: 적절한 오류 복구 메커니즘을 구현합니다. 잠금을 유지하는 동안 인스턴스가 실패하면 잠금은 다음 이후에 자동으로 해제되어야 합니다.
최대 잠금시간이 지났습니다.
관련 제품 링크
다른 응용 분야에 적합한 고품질 잠금 장치를 찾고 계시다면 저희 제품에 관심이 있으실 것입니다.푸시 잠금,나무로 되는 문 자물쇠, 그리고원형 도어록.
조달 문의
우리는 고가용성 시스템에서 안정적인 잠금 솔루션의 중요성을 이해하고 있습니다. 창고 잠금 장치 공급업체로서 우리는 귀하에게 최고의 제품과 지원을 제공하기 위해 최선을 다하고 있습니다. 고가용성 프로젝트를 위한 Shed Lock 구매에 관심이 있거나 구성에 대해 질문이 있는 경우 문의하시기 바랍니다. 당사와 대화를 시작하여 귀하의 특정 요구 사항에 대해 논의하고 당사의 Shed Lock이 귀하 시스템의 성능과 신뢰성을 어떻게 향상시킬 수 있는지 알아보세요.


참고자료
- Shed Lock 공식 문서, "https://www.javacrumbs.net/shedlock/"
- Spring Framework 문서, "https://docs.spring.io/spring-framework/docs/current/reference/html/"
