コンテンツにスキップ

キューを使用して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('失敗しました!');
}