边缘函数

后台任务

如何在边缘函数中运行请求处理器之外的后台任务


边缘函数实例可以在请求处理程序之外处理后台任务。后台任务适用于异步操作,例如将文件上传到存储、更新数据库或向日志服务发送事件。您可以立即响应请求,同时让任务在后台继续运行。

工作原理

您可以使用 EdgeRuntime.waitUntil(promise) 显式标记后台任务。函数实例将持续运行,直到提供给 waitUntil 的 Promise 完成。

最大持续时间受限于实际时间、CPU 和内存限制。当达到这些限制之一时,函数将停止运行。

您可以通过监听 beforeunload 事件处理程序来获知函数调用即将停止的通知。

示例

以下示例展示了如何使用 EdgeRuntime.waitUntil 运行后台任务,并通过 beforeunload 事件在实例即将停止时获得通知。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
async 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。这不会阻塞请求。

1
2
3
4
5
6
7
8
9
10
11
12
async 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 文件,添加以下配置:

1
2
[edge_runtime]policy = "per_worker"

当使用 per_worker 策略运行时,函数在编辑后不会自动重新加载。您需要通过运行 supabase functions serve 手动重启它。