저는 AI로 문서를 검증하는 작업을 수동으로 돌리다가, 한 번에 너무 많은 요청을 보내 Supabase가 버거워하는 모습을 봤습니다. 그래서 cron 엔드포인트를 만들어 제한된 수의 레코드만 안전하게 처리하도록 만들었습니다.
CRON_SECRET Bearer 토큰으로 인증된 호출만 허용합니다.pending 상태의 레코드를 최대 100개까지 조회하고, 이미 제출됐거나 첨부가 없는 건 건너뜁니다.요청 헤더의 Authorization이 Bearer ${CRON_SECRET}인지 확인합니다. 설정이 없으면 500을, 키가 다르면 401을 반환합니다.
verification_status = 'pending'인 레코드를 오래된 순으로 가져옵니다. 이미 제출된 기록이나 첨부 파일이 없는 경우는 건너뜁니다.
각 레코드마다 내부 API를 호출하고 ok, status, body를 기록합니다. 실패해도 루프를 멈추지 않고 계속 진행합니다.
import { NextRequest } from 'next/server';
for (const recordId of targets) {
try {
const response = await fetch(`${request.nextUrl.origin}/api/admin/records`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ recordId }),
});
const payload = await response.json().catch(() => null);
results.push({
recordId,
ok: response.ok,
status: response.status,
body: payload,
});
} catch (error) {
results.push({
recordId,
ok: false,
status: 0,
error: error instanceof Error ? error.message : 'Unknown error',
});
}
}
status: 0으로 기록했습니다.지금은 cron이 5분마다 실행돼도 Supabase가 버거워하지 않고, 처리 결과를 쉽게 모니터링할 수 있습니다. AI 요청이 실패했을 때도 어떤 레코드에서 문제가 났는지 바로 확인할 수 있게 되었죠. 다음에는 결과를 테이블에 로그로 남겨 추세를 분석해볼 계획입니다.
여러분은 배치 작업을 어떻게 관리하고 계신가요? 안전장치 아이디어가 있다면 댓글로 공유해주세요.