06·개념·8분

스케줄과 백그라운드 작업

앱이 하는 모든 일이 클릭에서 시작하지는 않습니다. 어떤 일은 시계에 맞춰 돌고, 어떤 일은 방문자를 기다리게 하기엔 너무 느립니다.

크론: 정해진 시간의 작업

크론 작업은 정해진 시간에 실행되는 작업입니다. 스케줄은 다섯 칸으로 씁니다. 분, 시, 일, 월, 요일. 몇 가지 읽어 보면:

  • 0 0 * * *: 매일 자정
  • 0 9 * * 1: 매주 월요일 9:00
  • */15 * * * *: 15분마다

스케줄러는 그 시각에 앱의 경로(예: /api/send-digest)를 호출합니다. 앱은 호출될 때 일을 하고, 스케줄러는 언제 할지만 정합니다. 시간은 고정된 시간대, 보통 UTC 기준이라 서울의 9:00은 UTC 0:00입니다.

큐: 백그라운드 작업

누군가 주문하면 영수증 이메일이 "감사합니다" 페이지를 늦추면 안 됩니다. 앱은 작업을 큐에 넣고 즉시 응답합니다. 워커가 작업을 집어 몇 초 뒤 이메일을 보냅니다.

재시도와 멱등성

백그라운드 작업은 가끔 실패합니다. 메일 서버가 바쁘거나 네트워크가 잠깐 끊깁니다. 큐는 보통 점점 늘어나는 간격으로 재시도합니다. 이것이 새 문제를 만듭니다. 실패 전에 절반만 끝난 작업이 다시 실행됩니다. 작업은 멱등해야 합니다. 두 번 실행해도 안전해야 합니다. "주문 42의 영수증이 아직 없으면 보내라"는 안전하고, "영수증을 보내라"는 아닙니다.

크론 작업도 같은 주의가 필요합니다. 야간 실행이 늦어져 다음 실행이 시작되더라도 둘이 누구에게도 이중 청구하면 안 됩니다.

DontCode에서는

인사이트 프로젝트에는 크론 작업 페이지가 있습니다. 작업마다 이름, 호출할 경로, 스케줄을 정하고 저장하세요. 디스패치, 재시도, 호출 인증은 플랫폼이 처리합니다. 플랜에 따라 예약할 수 있는 작업 수와 월 실행 횟수에 한도가 있습니다. Insight 빌드 자체도 백그라운드 작업으로 실행되기 때문에 빌드 페이지가 스피너를 기다리게 하는 대신 진행 상황을 보여줍니다.

더 알아보기

이해도 확인

  1. 1.`0 9 * * 1`은 언제 실행될까요?

  2. 2.영수증 이메일을 결제 중이 아니라 백그라운드 작업에서 보내는 이유는?

  3. 3."고객에게 10,000원 청구" 작업이 청구 후 기록 전에 실패하고 재시도됩니다. 설계의 무엇이 잘못됐을까요?

  4. 4.9:00으로 설정한 스케줄이 서울에서 18:00에 실행됩니다. 가장 가능성 높은 이유는?