Troubleshooting 'CONNECT_TIMEOUT' or hanging queries in Serverless Functions
Last edited: 8/12/2026
在无服务器函数中使用持久化客户端(如 postgres-js)时,可能会出现间歇性的 CONNECT_TIMEOUT 错误或查询挂起直到达到执行限制的情况。
🌐 Intermittent CONNECT_TIMEOUT errors or queries that hang until reaching the execution limit may occur when using persistent clients, such as postgres-js, within Serverless Functions.
为什么会这样?
无服务器环境可能会在请求之间冻结函数。这会导致 TCP 套接字变得过时,因为连接池或 NAT 可能会在客户端 keepalive 定时器暂停时丢弃不活动的连接。函数恢复运行后,客户端尝试重用已经失效的套接字,从而导致挂起。
如何解决这个问题:
- 使用数据 API: 将以读取为主的工作负载迁移到 Supabase 数据 API(PostgREST)。这使用无状态的 HTTP 请求,避免了持久 TCP 套接字的问题。
- 活跃性预检: 对于使用
postgres-js的事务路径,在执行主查询前,通过让SELECT 1查询与一个短超时(例如几秒)竞争来实现预检。如果预检超时,就重启数据库客户端。 - 迁移到 Vercel Fluid Compute: 使用 Vercel 的 Fluid Compute 和
attachDatabasePool。这个环境支持waitUntil钩子,它可以让运行时在实例暂停前正确关闭空闲连接。 - 应用重试: 针对连接超时错误实现应用层的重试逻辑,以强制进行新的连接尝试。