常见问题排查
解决与边缘函数相关的常见问题和故障
如果您在使用边缘函数时遇到任何问题,以下是一些排查和解决问题的建议步骤。
无法部署边缘函数
- 确保您使用的是最新版本的 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 Runtime 和 CLI 代码库中搜索错误信息,确认是否已有相关报告
- 如果上述命令的输出无法帮助解决问题,请通过 Supabase 仪表板(点击右上角的"帮助"按钮)提交支持工单,并包含所有输出和命令详情
高级技巧
监控边缘函数资源使用情况
要确定边缘函数消耗的内存和 CPU 资源,请按照以下步骤操作:
- 进入 Supabase 仪表板
- 导航至 边缘函数 页面
- 点击函数名称选择特定函数
- 在提供的图表中查看 指标 部分的资源使用情况
与传统服务器相比,边缘函数的资源(CPU、内存和执行时间)有限。请确保您的函数已针对性能进行优化,且不超过分配的资源限制。
理解 CPU 软硬限制
隔离实例(Isolate)就像一个可以处理多个函数请求的工作线程。它会持续工作直到达到400秒的时间限制。目前CPU有两种限制类型:
- 软限制:当隔离实例达到软限制时,它会进入退休状态。这意味着它不会接受新的请求,但会继续处理当前正在进行的请求。它会持续运行直到达到CPU时间的硬限制或400秒的时间限制,以先到者为准。
- 硬限制:如果在达到软限制后仍有新请求,系统会创建一个新的隔离实例来处理它们。原始隔离实例会继续运行直到达到硬限制或时间限制。这确保了现有请求能够完成,而新请求将由新创建的隔离实例处理。
检查函数启动时间
查看函数的日志。在日志中寻找"Booted"事件并记录报告的启动时间。如果可用,点击事件可以获取更多详细信息,包括服务该函数的区域。调查启动时间是否异常高(超过1秒)并记录出现的模式或区域。您可以参考区域调用故障排除指南进行排查。
查找包体积
要查找函数的包体积,请在本地运行以下命令:
deno info /path/to/function/index.ts
在输出中查找"size"字段,它表示函数的近似包体积。通过Supabase CLI部署函数时,您可以获取准确的包体积。如果函数是大型应用的一部分,建议单独检查该函数的包体积。
函数的源代码受限于10MB的站点限制。
分析依赖关系
在分析 Supabase 边缘函数的依赖关系时,必须同时审查 Deno 和 NPM 依赖项,以确保最佳性能和资源利用率。通过选择性导入仅需要的子模块,您可以有效减少函数依赖项的大小并优化其性能。在最终确定导入项之前,请确保审查 Deno 和 NPM 依赖项,检查是否存在可以移除的不必要或冗余依赖项。此外,检查过时的依赖项并尽可能更新到最新版本。
Deno 依赖项
运行 deno info
命令,如果使用了导入映射表请提供其路径。审查输出中列出的依赖项。特别注意任何特别大的依赖项,因为它们可能导致包体积增加和潜在的启动时间问题。检查是否存在可以移除的不必要或冗余依赖项。检查过时的依赖项并尽可能更新到最新版本。
1deno info --import-map=/path/to/import_map.json /path/to/function/index.ts
NPM 依赖项
此外,如果在边缘函数中使用了 NPM 模块,必须注意它们的大小对整体包体积的影响。在导入 NPM 模块时,考虑使用 import { submodule } from 'npm:package/submodule'
语法来选择性导入特定子模块,而不是导入整个包。这种方法有助于减少不必要的开销并简化函数的执行。
例如,如果只需要从 googleapis
包中导入 Sheets
子模块,可以这样导入:
1import { Sheets } from 'npm:@googleapis/sheets'