Skip to content

別Workerからの投入

ジョブの投入のみを行うWorkerでは、tsumugi/clientを使用します。

使用方法

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

必要なbindingはJOB_SHARDのみで、ジョブ管理Workerと同じDurable Objectを指定する必要があります。

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

設定を揃える

shardsを2以上に設定している場合、投入側にも同じ設定が必要になります。
これは、分割数が一致しない場合に投入先のDurable Objectが変わるためです。

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

policyと保持期間もここで指定可能です。本体側と同じ値を指定してください。

API

メソッド内容
enqueue(env, input)1件投入してジョブIDを返す
enqueueMany(env, inputs)複数件をまとめて投入する
shardFor(env, binding, partitionKey?)対象のDurable Objectのstubを直接取得する

enqueueManyは件数が増えても所要時間がほとんど変わりません。
enqueueを逐次で呼び出すと件数に比例して遅くなります。

tsumugi/clientからはEnqueueInput EnqueueOptions EnqueueItem JobQueue Performers BindingConfig TsumugiClientなどの型を参照可能です。

createClientが受け取るのはEnqueueInputで、bindingstringpayloadunknownのみが許容されます。
bindingごとの型と必須キーの強制は適用されません。詳細は投入経路を参照してください。
performerの型を共有できる場合、JobQueue<M>に適合するラッパーを利用側で用意すると同じ強制を適用することができます。

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を参照してください。