스프링 / 스케쥴러 / scheduler / celery
Java Spring JobRunr
- job 을 다른 background thread에서 수행한다. 그래서 web request 가 block 되지 않는다.
- java 8 lambda 를 분석해서 json 으로 serialize한다. 이 것을 db 에 저장한다.
- 많은 job 들이 만들어져서, server 가 그 load를 처리할 수 없게 됐을때, app instance 를 늘리면, JobRunr이 자동으로 그 job 을 분산시킨다.(scale horizontally)
- retry 는 자동으로 이뤄지는데, 이때 exponential back-off policy 를 사용한다.
- 모든 job들을 monitor 하는 built-in dashboard 가 있다.
- 성공한 job 들을 일정 시간이 지나면 자동으로 지워지게 할 수 있다. 이 일정시간을 설정할 수 있다.
- Real time trigger processing · jobrunr/jobrunr · Discussion #442 · GitHub : 5초 단위의 pollingTimeInterval 을 갖는다. 그래서 그보다 낮은 시간간격으로 수행해야 하는 job 들의 경우 문제가 있다. 그리고 정확히 간격이 맞지 않는다면, 특정 scheduled job 이 정해진 시간보다 먼저 실행될 수도 있다?
- Background
Job Poll Interval time | github : pollingTimeInterval 의 기본값은
15초
- Important remarks | Recurring jobs · JobRunr
port 설정
기본은 8000
이다. localhost:8000/dashboard
로 가면 JobRunr 의 dashboard를 확인할 수 있다. 다음처럼 config file 에서
변경할 수 있다.
org.jobrunr.dashboard.enabled=true
org.jobrunr.dashboard.port=8000
매분단위 job 을 실행한 개인적인 경험, jobrunr 6.2.3
매분마다 도는 job 을 설정해놨다. 그러고 나서, 보니 같은 시점에 2개가 실행됐다. 그래서 db 의 jobrunr_jobs 에서 확인을 해보니, 같은 시간에 2번이 실행됐다.
created_at 을 보니, 매 분마다 실행시간이 조금씩 밀렸다. 대략
0.08s~0.09s
씩 늦어졌다. 그래서 결국 같은 시점에 2번이
실행되는 상황이 왔다.
위의 5초단위의 pollingTimeInterval
과 어느정도
상관관계가 있는 듯도 싶다. 만약 항상 40~50초 시점에 trigger 가 발생한다면, job 내에서 시간을 보정해서 사용하는 것도 방법일 듯 하다.
같은 ‘분’(minute)에 실행된 job 들을 확인하기 위한 query
-- 같은 '분'(minute)에 실행된 job 들
SELECT * FROM (
SELECT count(his) cnt, t1.* FROM (
SELECT DATE_FORMAT(createdAt, '%j %H:%i') AS his, DATE_FORMAT(createdAt, '%H:%i:%S.%f'), createdAt, updatedAt
FROM jobrunr_jobs
WHERE recurringJobId
IN('myjob.MyJobBackgroundJobProcessor.runEveryMinuteExample()')
ORDER BY createdAt DESC
) AS t1
GROUP BY t1.his
) AS tt1 WHERE cnt > 1
;
이슈가 있던 때의 createdAt 과 updatedAt 값들
createdAt | updatedAt |
---|---|
2024-02-13 04:21:59.615 | 2024-02-13 04:21:59.696 |
2024-02-13 04:22:59.715 | 2024-02-13 04:22:59.793 |
2024-02-13 04:23:59.812 | 2024-02-13 04:23:59.880 |
2024-02-13 04:24:59.904 | 2024-02-13 04:24:59.988 |
2024-02-13 04:26:00.016 | 2024-02-13 04:26:00.393 |
2024-02-13 04:26:45.418 | 2024-02-13 04:26:45.494 |
2024-02-13 06:39:59.635 | 2024-02-13 06:39:59.706 |
2024-02-13 06:40:59.726 | 2024-02-13 06:40:59.793 |
2024-02-13 06:41:59.812 | 2024-02-13 06:41:59.885 |
2024-02-13 06:42:59.910 | 2024-02-13 06:42:59.976 |
2024-02-13 06:44:00.001 | 2024-02-13 06:44:00.327 |
2024-02-13 06:44:45.314 | 2024-02-13 06:44:45.358 |
2024-02-13 08:54:59.536 | 2024-02-13 08:54:59.603 |
2024-02-13 08:55:59.625 | 2024-02-13 08:55:59.695 |
2024-02-13 08:56:59.723 | 2024-02-13 08:56:59.804 |
2024-02-13 08:57:59.820 | 2024-02-13 08:57:59.887 |
2024-02-13 08:58:59.913 | 2024-02-13 08:58:59.980 |
2024-02-13 09:00:00.020 | 2024-02-13 09:00:03.025 |
2024-02-13 09:00:46.289 | 2024-02-13 09:00:46.723 |
cron time 설정시 주의
만약 다음처럼 정의를 하면,
@Recurring(cron = "*/10 * * * *", zoneId = "Asia/Seoul")
job 은 다음처럼 10분 근처에서 실행한다. 30분에 대한 trigger 가 29:54 쯤에 발생한다.
createdAt | updatedAt |
---|---|
2024-02-17 07:29:54.207 | 2024-02-17 07:29:54.239 |
2024-02-17 07:19:53.956 | 2024-02-17 07:19:53.983 |
2024-02-17 07:09:53.689 | 2024-02-17 07:09:53.798 |
Reference
Start recurring jobs multiple times? · jobrunr/jobrunr · Discussion #755 · GitHub
댓글 없음:
댓글 쓰기