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

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

相关推荐
Coder_Boy_22 分钟前
Java高级_资深_架构岗 核心知识点——高并发模块(底层+实践+最佳实践)
java·开发语言·人工智能·spring boot·分布式·微服务·架构
tod1132 小时前
Redis 分布式锁进阶:从看门狗到 Redlock 的高可用实践
数据库·redis·分布式
闲人编程2 小时前
Celery分布式任务队列
redis·分布式·python·celery·任务队列·异步化
tod1133 小时前
Redis:从消息中间件到分布式核心
服务器·开发语言·redis·分布式
yangyanping2010812 小时前
系统监控Prometheus之三自定义埋点上报
分布式·架构·prometheus
万象.15 小时前
redis缓存和分布式锁
redis·分布式·缓存
白太岁16 小时前
Redis:(2) hiredis 使用、C++ 封装与连接池
c语言·c++·redis·缓存
听麟16 小时前
HarmonyOS 6.0+ 跨端会议助手APP开发实战:多设备接续与智能纪要全流程落地
分布式·深度学习·华为·区块链·wpf·harmonyos
Tadas-Gao1 天前
微服务注册中心选型深度分析:Eureka、Nacos与新一代替代方案
java·分布式·微服务·云原生·eureka·架构·系统架构
百锦再1 天前
HashMap、Hashtable、TreeMap异同深度详解
jvm·spring boot·struts·spring cloud·缓存·kafka·tomcat