ByteNoteByteNote

字节笔记本

2026年2月20日

Cloudflare Hyperdrive 连接策略完全指南

本文深入讲解 Cloudflare Hyperdrive 的数据库连接策略,包括连接池原理、配置最佳实践和常见问题排查。

什么是 Hyperdrive

Hyperdrive 是 Cloudflare 提供的数据库连接加速服务,它在全球边缘节点维护与数据库的长连接池,让 Serverless 应用能够快速、高效地访问数据库。

核心原理:连接池

传统架构的问题

在传统的 Node.js 应用中,数据库连接通常是长驻的:

text
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Worker 1  │────▶│  Connection │────▶│  Database   │
│   (10 conn) │     │    Pool     │     │             │
└─────────────┘     └─────────────┘     └─────────────┘

但在 Serverless 环境下,这会导致严重问题:

  1. 冷启动时创建连接:每个 Worker 实例启动都要新建连接
  2. 连接数爆炸:1000 个 Worker 实例 = 1000 个数据库连接
  3. 数据库拒绝服务:Postgres 默认最大连接数通常只有 100

Hyperdrive 的解决方案

Hyperdrive 在边缘节点维护连接池,Worker 通过内网快速连接:

text
┌─────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────┐
│ Worker  │────▶│  Hyperdrive │────▶│  Connection │────▶│Database │
│ (CF内网)│     │  (边缘节点) │     │    Pool     │     │         │
└─────────┘     └─────────────┘     └─────────────┘     └─────────┘
     │                  │
     └──────────────────┘
      内网延迟 < 1ms

关键优势

  • Worker 到 Hyperdrive:内网级别延迟(< 1ms)
  • Hyperdrive 到数据库:长连接复用
  • 连接数可控:无论多少 Worker,数据库连接数保持稳定

配置最佳实践

1. Wrangler 配置

toml
# wrangler.toml
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "your-hyperdrive-id"

2. 环境变量获取

typescript
import { getCloudflareContext } from '@opennextjs/cloudflare';

function getHyperdriveConnection() {
  const { env } = getCloudflareContext();

  // 生产环境:使用 Hyperdrive
  if (env.HYPERDRIVE?.connectionString) {
    return {
      connectionString: env.HYPERDRIVE.connectionString,
      useSSL: false  // 内网连接,不需要 SSL
    };
  }

  // 本地开发:使用直连
  if (env.DATABASE_URL) {
    return {
      connectionString: env.DATABASE_URL,
      useSSL: 'require'
    };
  }

  throw new Error('Database connection not configured');
}

3. 请求级连接创建

typescript
import { cache } from 'react';

// ✅ 正确:每个请求创建连接,但同一请求内复用
export const getDb = cache(() => {
  const config = getHyperdriveConnection();
  return createDatabase(config);
});

// ❌ 错误:全局单例在 Cloudflare Worker 中无法工作
// export const db = createDatabase(config);

不同数据库的配置

Supabase

typescript
// 生产环境:使用 Hyperdrive(直连端口 5432)
const hyperdriveConfig = {
  host: 'your-project.supabase.co',
  port: 5432,  // 直连端口
  ssl: false   // Hyperdrive 内网连接不需要 SSL
};

// 本地开发:使用 Pooler(端口 6543)
const localConfig = {
  host: 'your-project.supabase.co',
  port: 6543,  // Pooler 端口
  ssl: 'require'
};

注意:Hyperdrive 必须连接 Supabase 的直连地址(5432),不能连接 Pooler(6543)。

Neon

typescript
// Neon 支持 IPv4,本地开发更友好
const config = {
  connectionString: env.DATABASE_URL,
  ssl: env.NODE_ENV === 'production' ? false : 'require'
};

自建 PostgreSQL

typescript
const config = {
  host: env.DB_HOST,
  port: 5432,
  database: env.DB_NAME,
  user: env.DB_USER,
  password: env.DB_PASSWORD,
  ssl: false  // 如果 Hyperdrive 和数据库在同一私有网络
};

常见问题

Q1: 本地开发连不上 Hyperdrive?

原因:Hyperdrive 只能在 Cloudflare 网络内访问。

解决方案

typescript
function getConnectionInfo() {
  const { env } = getCloudflareContext();

  // 生产环境
  if (env.HYPERDRIVE?.connectionString) {
    return { connectionString: env.HYPERDRIVE.connectionString, ssl: false };
  }

  // 本地开发:使用普通连接
  return { connectionString: env.DATABASE_URL, ssl: 'require' };
}

Q2: SSL 握手失败?

症状Error: SSL connection is not supported

原因:Hyperdrive 到 Worker 是内网连接,不需要 SSL。

解决

typescript
const ssl = hyperdriveConnection ? false : 'require';

Q3: 连接超时?

症状The Workers runtime canceled this request

原因:全局缓存了数据库连接实例。

解决:使用 cache() 确保每个请求创建新连接:

typescript
export const getDb = cache(() => createDatabase(config));

Q4: Supabase IPv6 问题?

症状:本地开发无法连接 Supabase 直连地址。

原因:Supabase 免费版直连只支持 IPv6。

解决:本地使用 Pooler(6543),生产使用 Hyperdrive(5432)。

性能优化

连接池大小

Hyperdrive 默认维护 10-20 个数据库连接,可以通过以下方式优化:

  1. 监控连接使用率:在 Cloudflare Dashboard 查看
  2. 调整连接池大小:根据并发量调整
  3. 使用连接预热:部署前预热连接池

查询优化

typescript
// ✅ 批量查询,减少往返
const results = await db.batch([
  db.select().from(users).where(eq(users.id, 1)),
  db.select().from(posts).where(eq(posts.userId, 1)),
]);

// ❌ 避免 N+1 查询
for (const user of users) {
  await db.select().from(posts).where(eq(posts.userId, user.id));
}

监控与调试

日志记录

typescript
const db = drizzle(client, {
  logger: {
    logQuery: (query, params) => {
      console.log('Query:', query);
      console.log('Params:', params);
    }
  }
});

性能指标

在 Cloudflare Dashboard 监控:

  • 查询延迟(P50/P99)
  • 连接池使用率
  • 缓存命中率

总结

场景推荐方案
生产环境Hyperdrive + 直连(SSL 关闭)
本地开发普通连接(SSL 开启)
高并发Hyperdrive 连接池 + 查询优化
多区域Hyperdrive 自动边缘加速

Hyperdrive 让 Serverless 应用能够高效访问数据库,关键是理解其连接池原理,正确配置 SSL,以及避免全局连接缓存。


相关文章

分享: