[컴] Java Spring JobRunr

 

스프링 / 스케쥴러 / 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

  1. Background Jobs in Spring with JobRunr | Baeldung

Start recurring jobs multiple times? · jobrunr/jobrunr · Discussion #755 · GitHub

댓글 없음:

댓글 쓰기