본문 바로가기
Backend2026년 5월 21일4분 읽기

Deno 3.1 Cron + Queues — 서버리스 크론잡 30분 셋업

YS
김영삼
조회 987
Deno 3.1 Cron + Queues — 서버리스 크론잡 30분 셋업

핵심 요약

Deno 3.1과 Deploy의 Cron/Queue 기능으로 별도 Redis나 Kubernetes CronJob 없이 글로벌 배치 시스템을 만든다. 사내 일일 리포트, 실패 재시도, 지연 알림 모두 한 곳에서. 운영 인프라가 사라져 유지 비용 월 $310 → $42.

1. Cron

import { Deno } from 'deno'

Deno.cron('daily-report', '0 9 * * *', async () => {
  await generateAndEmail()
})
Deno.cron('hourly-cleanup', '0 * * * *', async () => {
  await db.deleteExpiredSessions()
})

코드 한 줄로 등록. 배포 시 자동 인식, 별도 manifest 불필요.

2. Queue — 지연·재시도

const kv = await Deno.openKv()

// 발행
await kv.enqueue({ type: 'send_email', to: 'a@b.c' }, { delay: 60_000 })

// 소비
kv.listenQueue(async (msg) => {
  if (msg.type === 'send_email') await sendEmail(msg)
})

실패 시 자동 백오프 재시도. 1초~7일 지연 가능.

3. 멱등성

한 메시지가 두 번 실행될 수 있음(at-least-once). DB 유니크 키 또는 KV에 처리 ID를 기록해 중복 방어.

4. 사용 사례 — 일간 리포트

Deno.cron('daily-report', '0 9 * * *', async () => {
  const sites = await db.activeSites()
  for (const s of sites) {
    await kv.enqueue({ type: 'report', siteId: s.id })
  }
})

kv.listenQueue(async (m) => {
  if (m.type === 'report') {
    const html = await renderReport(m.siteId)
    await mailer.send(...)
  }
})

크론은 디스패치만, 실행은 큐. 큐 동시성이 자동 스케일.

5. 비용

구성월 비용
Deploy Pro + 일 30만 큐 메시지$42
AWS Lambda + EventBridge + SQS$140
K8s CronJob + Redis$310

6. 함정

  • Cron + Queue는 Deploy 한정 — 셀프 호스팅 안 됨
  • 한 인스턴스당 처리량 한계가 있어 헤비 워크는 batch API/외부 워커로 위임
  • 로컬 개발은 deno serve에서 cron이 동작 안 함 → --unstable-cron 플래그

자주 묻는 질문

Q. Cloudflare Cron Triggers와 비교? Cloudflare는 Workers 한정 + Durable Objects 결합 필요. Deno는 KV 큐가 일급. 단순함은 Deno, 글로벌 분산 객체 상태는 Cloudflare.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록