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

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

相关推荐
云存储小天使13 小时前
训练效率提升50%以上:GooseFS 写缓存及其在具身智能数据处理中的应用
缓存·腾讯云·对象存储·goosefs
程序员夏洛16 小时前
Redis 数据过期后的删除策略是什么?
数据库·redis·缓存
鱼鳞_17 小时前
热门八股-Redis
数据库·redis·缓存
hweiyu0019 小时前
Redis命令:MIGRATE
redis·缓存
A.说学逗唱的Coke20 小时前
【人工智能专题】Redis 杀进 AI 数据层:向量搜索、语义缓存与 Agent 记忆工程从入门到踩坑
人工智能·redis·缓存
Lost of 程序猿20 小时前
ASP.NET Core Saga 分布式事务深度实战:备件采购跨服务长流程,如何保证“要么全成,要么全回“
分布式·后端·asp.net
XiYang-DING21 小时前
地图城市缓存优化:ApplicationReadyEvent + Caffeine + Redis + Redisson 分布式锁
redis·分布式·缓存
2601_962175661 天前
RabbitMQ 的工作模式
分布式·rabbitmq
头茬韭菜1 天前
图解 Fluss(四):分布式协调 —— 选举、副本状态机与
分布式·fluss
智购科技无人售货机厂家1 天前
2026自动售货机制冷系统维护指南:从散热器清洁到压缩机换油的工程实践~YH
运维·redis·物联网·缓存·架构