基于 Cloudflare Worker 构建分布式测速调度系统:KV 与 D1 数据层设计实战教程

本文将从工程架构角度,完整讲解如何在 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

调度性能提升一个数量级以上

相关推荐
风中凌乱36 分钟前
kafka新版本集群的安装与部署
分布式·kafka
SLD_Allen1 小时前
大规模分布式AI训练基础设施
人工智能·分布式·模型训练
正儿八经的少年2 小时前
redis 的大 key 和热 key 详解
数据库·redis·缓存
富士康质检员张全蛋3 小时前
Kafka的操作-消费的详情
分布式·kafka
X-⃢_⃢-X3 小时前
十、Redis之布隆过滤器
数据库·redis·缓存
昕光xg4 小时前
Istio笔记04-基于Jaeger的分布式链路追踪
笔记·分布式·istio
Database_Cool_4 小时前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙4 小时前
【Redis】1.Redis特性
数据库·redis·缓存
chexus4 小时前
21. 深入 Nginx HTTP 缓存源码:CDN功能
nginx·http·缓存
wWYy.18 小时前
分布式:数据复制
分布式