Schedule
ICE4에서 배치작업은 Schedule Task 데이터를 이용하여 실행 및 관리 할 수 있다.
Schedule Task
ScheduleTask는 다음과 같은 속성으로 정의되어 있다.
pid | valueType | description |
---|---|---|
id | STRING | 스케쥴의 아이디 |
name | STRING | 이름 |
scheduleType | CODE | 스케쥴 실행 시간 관련 유형
|
config | STRING | 실행 시간 관련 설정 데이터 |
enable | BOOLEAN | 사용 여부 |
executeType | CODE | 다중 서버에서의 실행 유형
|
microservice | REFERENCES | 해당 스케쥴이 실행될 마이크로서비스 지정 |
masterServer | REFERENCE | executeType이 server인 경우의 마스터 서버 지정 |
slaveServer | REFERENCE | executeType이 server인 경우의 슬래이브 서버 지정 |
syncTime | INT | sync나 server일때 동기화를 위해서 대기하는 시간 지정 |
actionType | CODE | 스케쥴 실행 유형
|
datasource | STRING | actionType이 update 또는 call인 경우 대상 DB의 datasource 지정 |
actionBody | STRING | 실행 구문 지정 (EventAction 참조) |
actionParam | STRING | 스케줄 실행에 필요한 파라미터 정의 |
loggingType | CODE | 스케줄 로그 저장 유형
|
logs | REFERENCED | 해당 스케쥴의 스케줄 로그 |
동작환경에 따른 설정 CASE
다중 서버에서 구동할경우에 스케쥴 설정은 다음과 같은 case로 구분할 수 있다.
모든 서버에서 독립적으로 동작
예를들어 각 서버의 로그 파일을 주기적으로 삭제해야하는 스케쥴 작업이 있다면, 이런 작업은 모드 서버에서 독립적으로 실행하면 된다. 이런 경우는 다음과 같이 설정한다.
{
"typeId": "scheduleTask",
"id": "cleanupLog",
"name": "Cleanup old logging - 30 days",
"scheduleType": "delay",
"config": "3600000",
"executeType": "parallel",
"microservice": "core",
"enable": true,
"actionType": "service",
"actionBody": "logService.cleanup",
"actionParam": "30"
}
해당 설정은 1시간마다(config: 3600000) 독립적(executeType: parallel)으로 모든서버(microservice: core)에서 동작한다.
모든 서버에서 동기화하여 동작
각 서버의 로그 파일을 주기적으로 읽어서 통계 데이터를 만드는 스케쥴 작업이 있다면, 이런 작업은 모든 서버에서 동작하지만 DB나 캐시 Lock을 피하기 위해서 동시에 실행하지 않도록 해야 하는데, 이런 경우는 다음과 같이 설정한다.
{
"typeId": "scheduleTask",
"id": "dataArchive",
"name": "Execute Data Archive",
"scheduleType": "cron",
"config": "0 10 * * * *",
"executeType": "sync",
"microservice": "core",
"enable": true,
"actionType": "service",
"actionBody": "dataArchiveService.archiveSchedule"
}
해당 설정은 매시간 10분에(0 10 * * * *
) 서버들간 동기화하여(executeType: sync)으로 모든서버(microservice: core)에서 동작한다. 즉, 한서버에서 동작하고 있는 동안에 다른 서버는 대기하고 있다가 동작하던 서버 작업이 완료된 후에 다른 서버에서 실행하게 된다.
한서버에서만 동작
외부 API를 호출하여 데이터를 주기적으로 수집하는 경우와 같은 스케쥴은 특정 시점에 한대의 서버에서만 동작해야 한다. 또한, 이중화 구성인 경우 한대의 서버가 동작하지 않을때에도 실행가능한 서버에서 동작해야하는 경우에는 syncTime을 설정하여 동작 방식을 결정할 수 있다.
{
"typeId": "scheduleTask",
"id": "testSync",
"name": "Test Sync",
"scheduleType": "cron",
"config": "0 0 1 * * *",
"enable": true,
"executeType": "sync",
"syncTime": "360",
"microservice": "test",
"actionType": "service",,
"actionBody": "basicSampleService.schedule"
}
해당 설정은 매일 새벽 1시(0 0 1 * * *
) test 마이크로서비스를 포함하고 있는 서버(microservice: test, ym 설정 참조) 중에서 하나의 서버에서 먼저 실행이 되면 다른 서버는 대기하다가 실행한 서버의 실행시간이 30분 이내(syncTime: 1800)면 실행하지 않고 30분 이상이면 해당 서버에서 스케줄을 실행한다. 여기서 syncTime의 역할은 두 대의 서버가 있는 경우에 한서버에서 스케줄이 먼저 실행한 경우 다른 서버는 대기를 하게 되는데, 만약 먼저 실행한 서버가 스케줄 실행을 정상적으로 완료하지 못하고 동작중에 다운된 경우에 다른 서버에서 이를 인식하여 동작하게 하기위한 설정으로 일반적으로 해당 스케줄 작업이 정상적으로 실행되었을 경우의 최대 실행 시간을 설정 하면 된다.