Skip to content

別Workerからの投入

ジョブを入れるだけで実行はしないWorkerからは、tsumugi/clientを使います

Durable Object実装を参照しないので、そちらのWorkerのバンドルには含まれません

使いかた

ts
import { createClient } from 'tsumugi/client';

const jobs = createClient<Env>();

export default {
  async fetch(request, env) {
    const id = await jobs.enqueue(env, {
      binding: 'MAIL',
      payload: { to: 'a@example.com', subject: 'hi' },
    });
    return Response.json({ id });
  },
} satisfies ExportedHandler<Env>;

必要なbinding

JOB_SHARDだけです。ジョブ管理Worker本体と同じDurable Objectを指します

jsonc
{
  "durable_objects": {
    "bindings": [
      {
        "name": "JOB_SHARD",
        "class_name": "TsumugiJobShard",
        "script_name": "my-jobs",
      },
    ],
  },
}

script_nameにはDurable Objectを定義しているWorkerの名前を書きます D1もQueuesもAnalytics Engineも不要です

設定を揃える

shardsを2以上にしている場合、投入側も同じ設定を知っている必要があります 分割数が食い違うと投入先のDurable Objectがずれるためです

ts
const jobs = createClient<Env>({
  MAIL: { shards: 4 },
});

policyや保持期間もここで渡せます これらはDurable Objectに投入時の設定として送られるので、本体と同じ値を書いておきます

API

メソッド内容
enqueue(env, input)1件入れてジョブIDを返す
enqueueMany(env, inputs)複数件を宛先Durable Objectごとにまとめて入れる
shardFor(env, binding, partitionKey?)対象Durable Objectのstubを直接引く

enqueueManyは宛先ごとに集約するので、件数が増えても往復は増えません enqueueを逐次で回すと78件/秒あたりでDurable Objectのソフト上限に律速されます

REST APIから入れる

Workerを足さずに済ませたい場合は、ジョブ管理Worker本体のREST APIを呼ぶ方法もあります

bash
curl -X POST https://my-jobs.example.workers.dev/api/jobs \
  -H "Authorization: Bearer $TSUMUGI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"binding":"MAIL","payload":{"to":"a@example.com","subject":"hi"}}'

詳しくはREST APIを参照してください