Cloudflare Workers支持Websocket却不支持Raw TCP?无服务器架构疑问
问题1:为什么Serverless后端不允许TCP连接却支持WebSocket?
得先理清两个关键逻辑:
- 像Cloudflare Workers这类基于V8 isolates的Serverless平台,核心诉求是启动快、资源占用极低、无状态运行。原始TCP连接需要维护长连接状态、占用操作系统套接字资源,和Serverless短生命周期、快速伸缩的特性完全冲突,所以平台直接禁用了自定义TCP连接的能力。
- WebSocket虽然底层依赖TCP,但Serverless平台已经把WebSocket的底层逻辑全封装了:从TCP握手、连接维护到消息转发,都由平台统一处理。你在Worker里只需要处理WebSocket的上层消息(比如
onmessage、onopen事件),不用直接操作TCP连接。相当于平台把TCP的复杂工作全包了,只给你开放了易用的WebSocket接口,所以你能正常用WebSocket,但不能自己建TCP连接。
问题2:Serverless后端如何与Serverful数据库(比如PostgreSQL)交互?
你看到的那段话点出了过去的核心矛盾:PostgreSQL默认用TCP连接,但Serverless平台不让直接用TCP。现在这个问题已经有了成熟的解决方案——Serverless数据库驱动,比如Neon推出的PostgreSQL Serverless Driver。
它的原理很直白:把原本基于TCP的PostgreSQL协议,转换成Serverless平台支持的HTTP/HTTPS请求。你在Worker里用这个驱动写数据库操作代码时,驱动会把SQL查询打包成HTTP请求发给数据库服务,数据库处理后再把结果通过HTTP响应返回给Worker,全程不用建立TCP长连接,完美适配Serverless环境。
举个极简的Cloudflare Worker示例(用Neon的驱动):
import { neon } from '@neondatabase/serverless'; export default { async fetch(request) { // 用Neon的Serverless连接字符串初始化驱动 const sql = neon('你的Neon数据库连接字符串'); // 执行SQL查询,底层是HTTP请求 const rows = await sql('SELECT * FROM users LIMIT 5'); return new Response(JSON.stringify(rows), { headers: { 'Content-Type': 'application/json' } }); } };
这样你就能在Serverless后端里正常操作传统的Serverful数据库了,不用再二选一。
原文引用:
"But there’s a problem. PostgreSQL connections are made over TCP. And modern serverless platforms like Cloudflare Workers or Vercel Edge Functions — based on V8 isolates — generally don’t talk TCP. So until now, you had an unfortunate choice. Serverless database or serverless compute: pick any one."
内容的提问来源于stack exchange,提问作者Nikhil Harisinghani

