NullcraftSearch
백엔드

백그라운드 작업을 제대로 다루기

자동화된 개발 워크플로를 보여주는 코드 에디터 인터페이스

백그라운드 작업은 요청 경로의 지연을 줄여 주지만, 책임을 없애 주지는 않는다. 큐는 실패를 지연되고 반복되며 때로는 순서가 바뀐 실행으로 바꾼다.

큐에 넣기 전에 의도를 먼저 저장하기

데이터베이스 트랜잭션은 반드시 일어나야 할 일을 기록한다. 그다음 아웃박스 발행자가 그 의도를 큐로 보내면서, 쓰기는 성공했지만 큐 삽입 호출은 실패하는 간극을 닫는다.

모든 작업은 반복된다고 가정하기

워커는 안정적인 작업 ID와 멱등적인 부수 효과를 사용한다. 재시도는 일시적 실패와 잘못된 입력을 구분하고, 의도적으로 정한 한도에 도달하면 멈춘다.

workers/invoice-delivery.ts
await jobs.runOnce(job.id, async () => {
  await invoices.deliver(job.invoiceId);
});

큐 상태를 드러내기

가장 오래된 작업의 나이, 처리량, 재시도율, 최종 실패를 추적한다. 큐 깊이만으로는 애매하다. 건강한 대량 배치가 독이 든 작업 하나보다 더 안전할 수 있다.

복구를 일상적인 절차로 만들기

운영자는 운영 데이터를 직접 수정하지 않고도 작업을 확인하고, 재시도하고, 취소할 수 있어야 한다. 복구 경로는 평소 유지보수 중에도 실행해 두어야 장애 상황에서도 믿고 사용할 수 있다.