ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Quartz를 이용한 클러스터링 설정과 구현 방법
    SpringBoot 2023. 12. 26. 08:33
    반응형

    Spring Boot와 Quartz 스케줄러를 사용하여, 여러 서비스 인스턴스에서의 클러스터링을 구현하는 방법을 설명합니다. Quartz의 클러스터링 기능을 활성화하여, 여러 서비스 인스턴스가 동일한 작업 스케줄을 공유하고, 한 인스턴스에서 실패한 작업을 다른 인스턴스에서 이어받을 수 있도록 구성합니다.

    의존성 추가

    implementation 'org.springframework.boot:spring-boot-starter-quartz'

    application.properties 설정

    application.properties 파일에 Quartz와 데이터베이스 관련 설정을 추가합니다. 이 설정은 Quartz가 클러스터링 모드로 작동하도록 구성하는 데 필요합니다.

    # 데이터베이스 설정
    spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db
    spring.datasource.username=myUser
    spring.datasource.password=myPassword
    
    # Quartz 설정
    spring.quartz.job-store-type=jdbc
    spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
    spring.quartz.properties.org.quartz.jobStore.isClustered=true
    spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000

    Quartz 스케줄러 설정

    Quartz 스케줄러를 설정하는 Java 설정 클래스를 작성합니다.

    import org.quartz.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class QuartzConfig {
    
        @Bean
        public JobDetail sampleJobDetail() {
            return JobBuilder.newJob(SampleJob.class)
                    .withIdentity("sampleJob")
                    .storeDurably()
                    .build();
        }
    
        @Bean
        public Trigger sampleJobTrigger(JobDetail jobDetail) {
            SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(60)
                    .repeatForever();
    
            return TriggerBuilder.newTrigger()
                    .forJob(jobDetail)
                    .withIdentity("sampleTrigger")
                    .withSchedule(scheduleBuilder)
                    .build();
        }
    }
    

    작업(Job) 정의

    Quartz에서 실행할 작업을 정의합니다.

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    public class SampleJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            // 작업 로직
            System.out.println("Executing Sample Job");
        }
    }
    

    클러스터링 확인

    애플리케이션을 여러 인스턴스에서 실행한 후, Quartz 데이터베이스의 qrtz_fired_triggers 테이블을 확인하여 클러스터링이 제대로 작동하는지 확인할 수 있습니다. 각 인스턴스는 이 테이블에 자신이 실행한 작업의 레코드를 남깁니다

    결론
    Quartz 클러스터링은 복잡한 스케줄링 요구사항을 가진 대규모 시스템에서 매우 유용합니다. 이 설정을 통해 여러 서비스 인스턴스가 동일한 작업 스케줄을 공유하며, 한 인스턴스의 장애가 발생했을 때 다른 인스턴스가 작업을 이어받을 수 있습니다.

    반응형
Designed by Tistory.