Skip to content

非同期ジョブ

Memory queue

テストではプロセス内queueを使用できます。

ts
const queue = new MemoryJobQueue()

queue.register('ranking.rebuild', async (payload, context) => {
    return rebuildRanking(payload.levelName)
})

await queue.enqueue(
    'ranking.rebuild',
    { levelName: 'tutorial' },
    { idempotencyKey: 'ranking:tutorial', maxAttempts: 3 },
)

PostgreSQL queue

ts
const queue = new PostgresJobQueue({
    executor,
    pollIntervalMs: 250,
    leaseMs: 30_000,
})

queue.register('ranking.rebuild', rebuildRanking)
await queue.ready()

複数workerはFOR UPDATE SKIP LOCKEDでjobを排他的に取得します。実行中はheartbeatでleaseを延長し、worker停止後に期限切れjobを別workerが回収します。失敗時は指数backoffで再試行し、maxAttempts到達後はdeadになります。

Webとworkerの分離

大規模構成では、web processはenqueueだけを担当し、handlerを登録するworker processを別に起動してください。

終了時はawait queue.close()でpollを停止し、実行中処理の境界を安全に閉じます。

Released under the ISC License.