后台任务
如何在边缘函数中运行请求处理器之外的后台任务
边缘函数实例可以在请求处理程序之外处理后台任务。后台任务适用于异步操作,例如将文件上传到存储、更新数据库或向日志服务发送事件。您可以立即响应请求,同时让任务在后台继续运行。
工作原理
您可以使用 EdgeRuntime.waitUntil(promise)
显式标记后台任务。函数实例将持续运行,直到提供给 waitUntil
的 Promise 完成。
最大持续时间受限于实际时间、CPU 和内存限制。当达到这些限制之一时,函数将停止运行。
您可以通过监听 beforeunload
事件处理程序来获知函数调用即将停止的通知。
示例
以下示例展示了如何使用 EdgeRuntime.waitUntil
运行后台任务,并通过 beforeunload
事件在实例即将停止时获得通知。
1234567891011121314151617181920async function longRunningTask() { // 在此处执行任务}// 将 longRunningTask 返回的 Promise 标记为后台任务// 注意:我们不使用 await 是为了避免阻塞EdgeRuntime.waitUntil(longRunningTask())// 使用 beforeunload 事件处理程序获取函数即将停止的通知addEventListener('beforeunload', (ev) => { console.log('函数即将停止,原因:', ev.detail?.reason) // 保存状态或记录当前进度})// 通过 HTTP 请求调用函数// 这将启动后台任务Deno.serve(async (req) => { return new Response('ok')})
在请求处理程序中启动后台任务
您也可以在请求处理程序中调用 EdgeRuntime.waitUntil
。这不会阻塞请求。
123456789101112async function fetchAndLog(url: string) { const response = await fetch(url) console.log(response)}Deno.serve(async (req) => { // 这不会阻塞请求, // 而是会在后台运行 EdgeRuntime.waitUntil(fetchAndLog('https://httpbin.org/json')) return new Response('ok')})
本地测试后台任务
当使用 Supabase CLI 在本地测试边缘函数时,实例会在请求完成后自动终止。这将阻止后台任务完成运行。
要解决这个问题,您可以更新 supabase/config.toml
文件,添加以下配置:
12[edge_runtime]policy = "per_worker"
当使用 per_worker
策略运行时,函数在编辑后不会自动重新加载。您需要通过运行 supabase functions serve
手动重启它。