边缘函数

常见问题排查

解决与边缘函数相关的常见问题和故障


如果您在使用边缘函数时遇到任何问题,以下是一些排查和解决问题的建议步骤。

无法部署边缘函数

  • 确保您使用的是最新版本的 Supabase CLI
  • 如果上述命令的输出无法帮助您解决问题,请通过 Supabase 仪表板(点击右上角的"帮助"按钮)提交支持工单,并附上上述所有命令的完整输出内容

无法调用边缘函数

如果您无法调用边缘函数或遇到 CORS 相关问题:

  • 请确认您已按照 CORS 指南进行操作。该指南详细说明了如何为边缘函数启用和配置 CORS,以及如何避免常见错误
  • 检查函数日志。在仪表板的函数管理页面中,从列表中选择您的函数并点击日志,查看是否有任何错误或警告信息

系统提供两种调试工具:调用记录和日志。调用记录显示每次执行的请求和响应信息,而日志则显示平台事件,包括部署过程和错误信息。

边缘函数响应时间过长

如果您的边缘函数响应时间过长或超时:

  • 在控制面板中导航至函数部分,从列表中选择您的函数,然后点击日志
  • 在日志中查找booted事件,检查启动时间是否一致。
    • 如果启动时间相近,可能是函数代码存在问题,例如大型依赖项、缓慢的API调用或复杂计算。您可以尝试优化代码、减小依赖项大小或使用缓存技术来提高函数性能。
    • 如果只有部分booted事件较慢,请在元数据中找到受影响的region,并通过顶部的"帮助"按钮提交支持请求。

收到546错误响应

出现546错误响应的可能原因:

  • 内存或CPU限制:函数可能耗尽了内存或遇到了执行期间强制实施的CPU限制。
  • 事件循环完成:如果在错误日志中看到"Event loop completed",很可能您的函数实现不正确。您应该检查函数代码是否存在语法错误、无限循环或未解决的Promise等问题。或者可以尝试在本地运行函数(使用Supabase CLI的**functions serve**命令)来调试错误。本地控制台会提供完整的错误堆栈跟踪及源代码行号。您也可以参考边缘函数示例获取指导。

本地使用 Supabase CLI 运行边缘函数的问题

  • 确保您使用的是最新版本的 Supabase CLI
  • 使用 -debug 标志运行 serve 命令
  • 支持工程师可以尝试在本地运行提供的示例代码,查看是否能复现问题
  • Edge RuntimeCLI 代码库中搜索错误信息,确认是否已有相关报告
  • 如果上述命令的输出无法帮助解决问题,请通过 Supabase 仪表板(点击右上角的"帮助"按钮)提交支持工单,并包含所有输出和命令详情

高级技巧

监控边缘函数资源使用情况

要确定边缘函数消耗的内存和 CPU 资源,请按照以下步骤操作:

  1. 进入 Supabase 仪表板
  2. 导航至 边缘函数 页面
  3. 点击函数名称选择特定函数
  4. 在提供的图表中查看 指标 部分的资源使用情况

理解 CPU 软硬限制

隔离实例(Isolate)就像一个可以处理多个函数请求的工作线程。它会持续工作直到达到400秒的时间限制。目前CPU有两种限制类型:

  1. 软限制:当隔离实例达到软限制时,它会进入退休状态。这意味着它不会接受新的请求,但会继续处理当前正在进行的请求。它会持续运行直到达到CPU时间的硬限制或400秒的时间限制,以先到者为准。
  2. 硬限制:如果在达到软限制后仍有新请求,系统会创建一个新的隔离实例来处理它们。原始隔离实例会继续运行直到达到硬限制或时间限制。这确保了现有请求能够完成,而新请求将由新创建的隔离实例处理。

检查函数启动时间

查看函数的日志。在日志中寻找"Booted"事件并记录报告的启动时间。如果可用,点击事件可以获取更多详细信息,包括服务该函数的区域。调查启动时间是否异常高(超过1秒)并记录出现的模式或区域。您可以参考区域调用故障排除指南进行排查。

查找包体积

要查找函数的包体积,请在本地运行以下命令:

deno info /path/to/function/index.ts

在输出中查找"size"字段,它表示函数的近似包体积。通过Supabase CLI部署函数时,您可以获取准确的包体积。如果函数是大型应用的一部分,建议单独检查该函数的包体积。

函数的源代码受限于10MB的站点限制。

分析依赖关系

在分析 Supabase 边缘函数的依赖关系时,必须同时审查 Deno 和 NPM 依赖项,以确保最佳性能和资源利用率。通过选择性导入仅需要的子模块,您可以有效减少函数依赖项的大小并优化其性能。在最终确定导入项之前,请确保审查 Deno 和 NPM 依赖项,检查是否存在可以移除的不必要或冗余依赖项。此外,检查过时的依赖项并尽可能更新到最新版本。

Deno 依赖项

运行 deno info 命令,如果使用了导入映射表请提供其路径。审查输出中列出的依赖项。特别注意任何特别大的依赖项,因为它们可能导致包体积增加和潜在的启动时间问题。检查是否存在可以移除的不必要或冗余依赖项。检查过时的依赖项并尽可能更新到最新版本。

1
deno info --import-map=/path/to/import_map.json /path/to/function/index.ts

NPM 依赖项

此外,如果在边缘函数中使用了 NPM 模块,必须注意它们的大小对整体包体积的影响。在导入 NPM 模块时,考虑使用 import { submodule } from 'npm:package/submodule' 语法来选择性导入特定子模块,而不是导入整个包。这种方法有助于减少不必要的开销并简化函数的执行。

例如,如果只需要从 googleapis 包中导入 Sheets 子模块,可以这样导入:

1
import { Sheets } from 'npm:@googleapis/sheets'