基于 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

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

相关推荐
三水不滴2 小时前
Redis 持久化机制
数据库·经验分享·redis·笔记·缓存·性能优化
heartbeat..4 小时前
Redis 中的锁:核心实现、类型与最佳实践
java·数据库·redis·缓存·并发
Prince-Peng4 小时前
技术架构系列 - 详解Redis
数据结构·数据库·redis·分布式·缓存·中间件·架构
虾说羊4 小时前
redis中的哨兵机制
数据库·redis·缓存
曹天骄6 小时前
基于 Cloudflare Worker + KV 构建高性能分布式测速调度系统(工程实战)
分布式
fendouweiqian6 小时前
Windows 11 使用 Scoop 安装/管理 Redis 7(支持多版本切换)并用 NSSM 作为服务开机自启
数据库·redis·缓存
奋进的芋圆7 小时前
Spring Boot 3 高并发事务与分布式事务企业级完整解决方案
spring boot·分布式
淡泊if7 小时前
Kafka部署模式详解:从单机到分布式集群的核心选择
分布式·kafka
鱼跃鹰飞7 小时前
面试题:什么是时钟回拨问题?怎么解决
分布式·系统架构