我有一个用例,我想通过 CloudFlare 工作线程运行可能长时间运行的查询。这些似乎对于简单快速的事情非常有效,但我正在考虑可能需要几分钟的查询。例如快速查询:
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext
): Promise<Response> {
const client = new Client(env.DB_URL);
await client.connect();
const result = await client.query("SELECT * FROM data");
const resp = new Response(JSON.stringify(result.rows), {
headers: { "Content-Type": "application/json" }
});
ctx.waitUntil(client.end());
return resp;
},
};
我真的不想等待工作人员运行很长的查询,所以我正在考虑一些工作人员发出查询并将结果粘贴到我可以轮询的缓存中的地方(所以也许这是只是 JavaScript 问题?)
不过,这只是我的一个想法。还有其他更多“最佳实践”方法可以解决这个问题吗?
一种解决方案可能是使用 Cloudflare 队列。将作业发送到触发 Worker(长时间运行的作业)的
long-running-jobs
队列。当长时间运行的作业完成时,它将结果发送到另一个队列(如果需要,可以发送到多个队列)long-running-results
,这会触发一个 Worker 对结果数据执行某些操作。如果出现错误,请将其发送至long-running-errors
。
您可以扩展该解决方案;
Queued
,Running
,Failed
,Completed
。可以使用数据库(Cloudflare D1 - 公开测试版)、键值存储(Cloudflare Workers KV)或强一致性存储(Cloudflare Durable 对象)来构建。请记住,Workers 的 CPU 时间有限制; HTTP 请求 30 秒,队列消费者 15 分钟。