キューを使用してR2にデータを保存する
キューを使用してデータをバッチ処理し、R2バケットに保存する方法の例。
以下のWorkerはJavaScriptエラーをキャッチし、それをキューに送信します。同じWorkerはそれらのエラーをバッチで受信し、R2バケットのログファイルに保存します。
name = "my-worker"
[[queues.producers]] queue = "my-queue" binding = "ERROR_QUEUE"
[[queues.consumers]] queue = "my-queue" max_batch_size = 100 max_batch_timeout = 30
[[r2_buckets]] bucket_name = "my-bucket" binding = "ERROR_BUCKET"type Environment = { readonly ERROR_QUEUE: Queue<Error>; readonly ERROR_BUCKET: R2Bucket;};
export default { async fetch(req, env): Promise<Response> { try { return doRequest(req); } catch (error) { await env.ERROR_QUEUE.send(error); return new Response(error.message, { status: 500 }); } }, async queue(batch, env): Promise<void> { let file = ''; for (const message of batch.messages) { const error = message.body; file += error.stack || error.message || String(error); file += '\r\n'; } await env.ERROR_BUCKET.put(`errors/${Date.now()}.log`, file); },} satisfies ExportedHandler<Environment, Error>;
function doRequest(request: Request): Promise<Response> { if (Math.random() > 0.5) { return new Response('成功!'); } throw new Error('失敗しました!');}