本文将从工程架构角度,完整讲解如何在 Cloudflare Worker 中,合理设计 Cloudflare KV 与 D1 数据库,实现高性能调度控制与可靠数据存储的解耦,为多源站测速调度系统提供可扩展的数据基础。
一、整体设计思路:控制面与数据面分离
在分布式调度系统中,高频读写与持久化分析往往存在天然冲突。
因此我们将系统拆分为两层:
✅ 控制面(Control Plane):Cloudflare KV
负责:
- 调度任务配置
- 运行状态机
- 高频读取缓存
特点:
- 全球边缘缓存
- 毫秒级访问
- 最终一致性
✅ 数据面(Data Plane):Cloudflare D1
负责:
- 源站元数据
- 测速任务元信息
- 全量测速历史数据
特点:
- 强一致性
- 可查询分析
- 持久化可靠
👉 架构原则:
高频调度走 KV
核心数据走数据库
二、KV 设计:调度控制中心
📌 1. 测速任务配置
Key
plain
config:speed_tasks
Value
plain
[
{
"id": "task_global",
"type": "all_origins",
"interval_sec": 300,
"path": "/speed-test",
"status": "active"
},
{
"id": "task_us",
"type": "single_origin",
"origin_id": 101,
"interval_sec": 60,
"path": "/speed-test",
"status": "active"
}
]
🔍 设计说明
type支持全量测速与单源站测速interval_sec支持秒级灵活调度status支持动态启停
📌 2. 任务运行状态
Key
plain
state:speed_tasks
Value
plain
{
"task_global": {
"last_run": 1700000000000,
"last_status": "success"
},
"task_us": {
"last_run": 1700000060000,
"last_status": "timeout"
}
}
🔍 设计说明
- 仅记录最近执行状态
- 作为调度状态机使用
- 不承担历史日志职责
📌 3. 活跃源站缓存
Key
plain
cache:active_origins
Value
plain
[
{
"id": 101,
"base_url": "https://origin-us.example.com",
"region": "us",
"weight": 1
},
{
"id": 102,
"base_url": "https://origin-eu.example.com",
"region": "eu",
"weight": 1
}
]
🔍 设计说明
- 缓存数据库源站列表
- 降低调度路径数据库访问
三、D1 数据库设计:持久化与分析基础
🗄 1. 源站表
plain
CREATE TABLE origin_server (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
region TEXT NOT NULL,
base_url TEXT NOT NULL,
status TEXT NOT NULL,
weight INTEGER DEFAULT 1,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
🗄 2. 测速任务元数据表
plain
CREATE TABLE speed_task (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_key TEXT UNIQUE NOT NULL,
origin_id INTEGER,
interval_sec INTEGER NOT NULL,
path TEXT NOT NULL,
status TEXT NOT NULL,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
👉 后台修改 → 同步 KV
🗄 3. 测速节点表
plain
CREATE TABLE probe_node (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
region TEXT NOT NULL,
provider TEXT NOT NULL,
endpoint TEXT NOT NULL,
status TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
🗄 4. 测速数据表(核心)
plain
CREATE TABLE speed_metric (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin_id INTEGER NOT NULL,
probe_id INTEGER NOT NULL,
dns_lookup INTEGER,
tcp_connect INTEGER,
tls_handshake INTEGER,
ttfb INTEGER,
download INTEGER,
total INTEGER,
status_code INTEGER,
remote_ip TEXT,
cdn_provider TEXT,
cdn_node TEXT,
cache_status TEXT,
response_size INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
🚀 推荐索引
plain
CREATE INDEX idx_metric_time ON speed_metric(created_at);
CREATE INDEX idx_metric_origin ON speed_metric(origin_id);
CREATE INDEX idx_metric_probe ON speed_metric(probe_id);
四、KV 与数据库协同工作流

五、调度状态管理最佳实践
✅ KV 中只保存:
- 最近执行时间
- 当前状态
- 简要运行信息
❌ 不保存:
- 历史执行记录
- 大量日志
历史数据统一写入 D1:
plain
INSERT INTO speed_metric (...) VALUES (...);
六、性能模型对比
| 操作 | 延迟 |
|---|---|
| KV 读取 | 1~5ms |
| D1 查询 | 20~50ms |
| 内存调度判断 | <1ms |
调度性能提升一个数量级以上