컴퓨터 클러스터와 Quartz를 이용한 분산 처리 방법 정리
컴퓨터 클러스터는 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합을 의미합니다. 클러스터는 분산 처리를 통해 작업을 효율적으로 수행할 수 있도록 합니다.
Quartz에서는 분산된 시스템을 하나로 동작하게 하기 위해 스케줄링 시스템을 데이터베이스(DB)화하여 관리합니다.
기존에는 메모리에 스케줄을 담고 있어, 여러 서버에서 동일한 소스로 구동 시 각각의 스케줄러가 동작하여 충돌 문제가 발생할 수 있습니다.
이를 해결하기 위해 스케줄을 DB에 담고, 각 서버는 DB에 저장된 정보를 기반으로 동작하게 됩니다. 하나의 서버가 스케줄을 선점하면 다른 서버는 해당 스케줄을 실행하지 않게 되어 충돌을 방지합니다. 또한 서버 간의 작업 분담과 서버 장애 시 대체가 가능합니다.


@Bean
public Job testJob() {
return jobBuilderFactory
.get("testJob")
.incrementer(new RunIdIncrementer())
.start(testStep())
.build();
}
@Bean
@JobScope
public Step testStep() {
return stepBuilderFactory
.get("testStep")
.<TestDomain, TestDomain>chunk(100)
.reader(testReader())
.processor(testProcessor())
.writer(testWriter())
.build();
}
@Bean
public JobDetail jobDetail() {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("jobName", "testJob");
return JobBuilder.newJob(CustomQuartzJobBean.class)
.withIdentity("testJob", null)
.setJobData(jobDataMap)
.storeDurably()
.build();
}
@Bean
public Trigger jobTrigger() {
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 * * * * ?");
return TriggerBuilder
.newTrigger()
.forJob(jobDetail().getKey())
.withIdentity("jobTrigger", null)
.withSchedule(scheduleBuilder)
.build();
}