Tsumugi

A job management system designed for the Cloudflare stack.

Tsumugi가 해결하는 문제

Cloudflare Queues를 잡 큐로 직접 사용하면 몇 가지 문제가 생깁니다.

  1. 01

    잡 상태를 관리하기 어렵고, 성공한 잡이 남지 않는다

    Queues
    Queues는 등록한 메시지의 상태를 조회하는 API를 제공하지 않습니다.
    Tsumugi
    Tsumugi의 대시보드와 REST API는 실행 중인 잡과 종료된 잡 모두에 대해 목록 표시, 검색, 집계를 제공합니다.
  2. 02

    배타 제어와 중복 제거를 구현하기 어렵다

    Queues
    Queues는 메시지 간의 의존 관계나 연관성을 관리하지 않습니다.
    Tsumugi
    Tsumugi에서는 같은 concurrencyKey를 지정한 잡이 한 건씩 순서대로 실행됩니다.
  3. 03

    잡 종류가 늘어날수록 분기가 늘어난다

    Queues
    Queues에서는 하나의 큐에 consumer를 하나만 설정할 수 있습니다.
    Tsumugi
    Tsumugi는 performer의 export 이름을 binding 이름으로 사용해 잡 종류를 구분하므로, consumer에 분기를 작성할 필요가 없습니다.
  4. 04

    드물게 메시지가 유실된다

    Queues
    Queues는 처리되지 않고 유실된 메시지를 감지하는 수단을 제공하지 않습니다.
    Tsumugi
    Tsumugi는 실행을 시작한 잡에서 결과가 보고되지 않으면 그 잡을 무응답으로 판정합니다.

사용자가 작성하는 코드

작성하는 곳은 잡 처리의 정의와 등록, 단 두 곳뿐입니다.

  1. 1 잡 처리를 performer로 정의

    src/performers/send-mail.ts
    import { Performer } from 'tsumugi/performer';export class SendMail extends Performer<{ to: string }, void, {}, Env> {  async perform(payload: { to: string }): Promise<void> {    await this.env.MAILER.send(payload.to);  }}
  2. 2 잡 등록

    src/index.ts
    import { defineTsumugi } from 'tsumugi';import { SendMail } from './performers/send-mail.js';const tsumugi = defineTsumugi({ performers: { SendMail } });const id = await tsumugi.enqueue(env, { binding: 'SendMail', payload: { to: 'a@example.com' } });

기능

performer와 enqueue로 구성

사용자는 잡 처리를 performer로 정의하고, 등록하는 곳에서 enqueue를 호출합니다. 잡의 전달, 실행, 상태 기록은 Tsumugi가 처리합니다.

  • 재시도
  • 백오프
  • 예약 실행
  • 정기 실행
  • 우선순위
  • 동시 실행 수
  • 속도 제한
  • 중복 제거
  • 대시보드

잡 관리 기능을 기본 탑재

재시도, 백오프, 예약 실행, 정기 실행, 우선순위, 동시 실행 수와 속도 제한, 중복 제거, 대시보드를 Tsumugi의 기본 기능으로 제공합니다.

종료된 잡 조회

대시보드와 REST API는 성공과 실패를 포함한 모든 잡에 대해 상태 목록 표시와 검색을 제공합니다. TSUMUGI_METRICS binding을 설정하면 실패율과 실행 시간 메트릭도 기록합니다.

잡 목록 페이지

의존 관계가 있는 처리

노드와 의존 관계를 선언하면, 앞 노드의 반환값이 다음 노드의 payload로 전달됩니다. fan-out을 정의하면 배열 요소마다 자식 노드가 만들어져 병렬로 실행됩니다.

메서드 호출을 통한 비동기 처리

enqueue(env, { binding, payload })를 호출하면 Tsumugi가 잡을 등록합니다. 반환값은 잡 ID이며, 호출은 즉시 완료됩니다.

잡 단위의 실행 보장

guarantee에 at-most-once를 지정한 잡은 두 번 실행되지 않습니다. guarantee의 기본값은 at-least-once입니다.

performer를 다른 Worker에 배치

performer를 Service Binding으로 연결한 다른 Worker에 배치한 경우에도 Tsumugi는 performer를 실행합니다.

대시보드

잡 목록 페이지Run 워터폴

Getting Started

  1. $pnpm add tsumugi
  2. $npx tsumugi init