안녕하세요

GCP cron: 특정 api로 요청 보내 작업 예약실행하기 본문

유튜브컨텐츠탐색-StelLife/Google App Engine

GCP cron: 특정 api로 요청 보내 작업 예약실행하기

sakuraop 2023. 3. 27. 08:03

https://cloud.google.com/appengine/docs/standard/nodejs/scheduling-jobs-with-cron-yaml?hl=ko#formatting_the_schedule 

 

cron.yaml로 작업 예약  |  Node.js 문서를 위한 App Engine 표준 환경  |  Google Cloud

주의: 앞으로 몇 개월에 걸쳐 Google은 콘텐츠를 보다 손쉽게 찾고 나머지 Google Cloud 제품과 더 잘 연동되도록 App Engine 문서 사이트를 재구성할 예정입니다. 제공되는 콘텐츠는 동일하지만, 이제

cloud.google.com


1. cron이란 무엇인가?

 

Cron은 유닉스 계열 운영체제에서 주기적으로 작업을 실행하기 위해 사용되는 시간 기반 스케줄러입니다. 

Cron은 주기적으로 수행되어야 하는 작업이 있을 때 유용합니다. 

특히, 서버에서 실행되는 백그라운드 작업이나 데이터 처리 작업 등의 작업을 주기적으로 수행하고 싶을 때 사용할 수 있습니다. 

또한, Cron을 사용하면 시스템 리소스를 효율적으로 사용할 수 있습니다. 

예를 들어, 백업 작업은 데이터베이스나 파일 시스템에 부하를 주는 작업이므로, 

사용자가 적은 시간에 백업 작업을 실행하여 서버 부하를 최소화할 수 있습니다.

2. cron.yaml 사용 예시

cron:
- description: "daily summary job"
  url: /tasks/summary
  schedule: every 24 hours
- description: "monday morning mailout"
  url: /mail/weekly
  schedule: every monday 09:00
  timezone: Australia/NSW
- description: "new daily summary job"
  url: /tasks/summary
  schedule: every 24 hours
  target: beta

=> description은 개발자가 이해하기 쉽도록 작성하는 작업 이름입니다.

1. /tasks/summary api로 24시간마다 GET 요청을 보냅니다.
2. /mail/weekly api로 매주 월요일 09시에 GET 요청을 보냅니다. 시간대는 NSW 기준입니다.

3. /tasks/summary로 24시간마다 GET 요청을 보내는데, beta 버전으로 라우팅합니다.

3. 직접 작성한 cron.yaml 코드 예시 

cron:
  - description: "Update new channels"
    url: /cron/update/new-channels
    schedule: every 12 hours
    retry_parameters:
      job_retry_limit: 2
      min_backoff_seconds: 3
      max_doublings: 3

  - description: "Update live streams"
    url: /cron/update/lives
    schedule: every 3 minutes
    retry_parameters:
      job_retry_limit: 2
      min_backoff_seconds: 3
      max_doublings: 3

/cron/update/new-channels 로 12시간마다 GET요청을 보낼 것입니다.

요청에 실패할 경우 최대 2번의 재시도를 할 것입니다. (200~299 이외의 status를 반환받은 경우)

1회 실패 시 3초 뒤에 재시도를 합니다.

2회 실패 시 3*2 뒤에 재시도를 합니다.

 

/cron/update/lives 로 3분마다 GET요청을 보낼 것입니다. (이하 동일)


4. api는 반드시 status를 반환해주어야 합니다.

// "/cron/update/lives"
app.get(
  "/cron/update/lives",
  wrapper(async (req, res) => {
    try {
      await updateTwitchLive(db);
      res.status(200).send("OK");
    } catch (error) {
      console.error(error);
      res.status(500).json({ error: "Internal server error" });
    }
  })
);

/cron/update/lives 로 GET요청이 있다면 updateTwitchLive 함수를 실행하고 200 status를 반환합니다.

 

크론 작업의 요청 핸들러가 200부터 299까지의 범위를 벗어나는 상태 코드를 반환하면 

App Engine은 해당 작업이 실패한 것으로 간주합니다. 

실패한 작업은 기본적으로 재시도되지 않습니다. 

스테이터스를 반환하지 않은 경우 cron 작업이 중단된다. 지연시간이 (거의 무한히) 발생하는 것을 볼 수 있다.


5. cron 스케줄러에 등록하려면 gcloud app deploy cron.yaml

cron.yaml을 작성하고 실행하면 등록이 된다.

=> 로그에서 자동으로 api 요청이 오는 것을 볼 수 있다.

=> 마지막으로 실행된 시각과, 다음 실행 시간을 알 수 있다.