핵심 요약
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