Cloudflare Workers 推出 connect() API 以创建 TCP 套接字

Cloudflare 开发者周亮点:Worker API 支持 TCP 套接字

在最近的 Cloudflare 开发者周 上,Cloudflare 宣布推出 Worker API,支持创建出站 TCP 套接字。这一新的套接字 API 使开发者能够直接从 Worker 连接到基于 TCP 的基础设施,包括数据库。

新 API 功能

新的 connect() 函数作为运行时 API 提供,返回一个 TCP 套接字,允许开发者在连接保持打开的状态下读取和写入数据。此前,Worker 已经可以与 HTTP 端点和 Cloudflare 服务进行交互,但大多数数据库要求客户端通过直接打开 TCP 套接字进行连接。

技术背景与挑战

Cloudflare 产品经理 Brendan Irvine-Broque 和产品总监 Matt Silverlock 解释道,尽管 Cloudflare 的目标是尽可能支持跨浏览器和非浏览器环境的标准 API,但在 TCP 套接字方面面临了挑战,因为运行时环境缺乏明确的标准。他们尝试整合现有 API 和提案的最佳元素,并计划为未来标准做出贡献。

WinterCG 社区组

去年秋天,Cloudflare 与 Vercel 和 Shopify 共同启动了 WinterCG,这是一个新的社区组,专注于在非 Web 浏览器的 JavaScript 开发环境中实现标准化 Web API 的互操作性。

使用示例

新 API 通过从 *cloudflare:sockets* 导入 connect 函数来访问。一个常见的用例是创建与数据库的连接,例如使用 PostgreSQL 的 pg 驱动:

import { Client } from "pg";

export interface Env {
  DB: string;
}

export default {
  async fetch(
    request: Request,
    env: Env,
    ctx: ExecutionContext
  ): Promise<Response> {
    const client = new Client(env.DB);
    await client.connect();
    const result = await client.query({
      text: "SELECT * from customers",
    });
    console.log(JSON.stringify(result.rows));
    const resp = Response.json(result.rows);
    // Close the database connection, but don't block returning the response
    ctx.waitUntil(client.end());
    return resp;
  },
};

当前限制与未来计划

虽然 PostgreSQL 的 pg 驱动已经支持,但 MySQL 的 mysqlmysql2 驱动尚未支持。Irvine-Broque 和 Matt Silverlock 指出,每次请求都会创建一个新连接,这是无服务器函数连接数据库的普遍挑战。他们正在为最受欢迎的数据库开发更简单的连接池方法。

Cloudflare 还计划在未来增加更多功能,包括支持入站 TCP 和 UDP 连接,以及基于 QUIC 的应用协议。

其他新功能

除了 connect() API,Cloudflare 还在开发者周 2023 上宣布了其他新功能,包括:

开发者反馈

UpLeveled 创始人 Karl Horky 在 推特 上表示,不需要像 Neon 或其他无服务器/边缘提供商那样的代理,直接通过 TCP 连接,这听起来很棒,可能比最近的其他边缘数据库公告更有意义。

限制

每个打开的 TCP 套接字都会计入 Worker 中同时打开的最大连接数,且无法在端口 25 上创建 TCP 连接以发送电子邮件到 SMTP 邮件服务器。

阅读 19
0 条评论