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

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

相关推荐
我是唐青枫17 分钟前
C#.NET 分布式事务 深入解析:TCC、Saga、Outbox 与落地取舍
分布式·c#·.net
会飞的大可2 小时前
Redis 竞品与替代方案选型可行性分析报告
数据库·redis·缓存
少许极端5 小时前
消息队列4-RabbitMQ的高级特性-TTL机制、死信队列、延迟队列
分布式·消息队列·rabbitmq
_深海凉_5 小时前
LeetCode热题100-LRU 缓存
算法·leetcode·缓存
難釋懷6 小时前
Redis缓存预热
redis·spring·缓存
会飞的大可7 小时前
Redis 故障排查与应急手册:从理论到实践
数据库·redis·缓存
m0_651593917 小时前
仓储系统核心编码设计与分布式ID生成实践
大数据·分布式
014-code8 小时前
RabbitMQ 生产端可靠投递(confirm、return、重试)
分布式·消息队列·rabbitmq
014-code8 小时前
RabbitMQ 消费端幂等实战(重复消息、去重、重放怎么处理)
分布式·消息队列·rabbitmq
jasnet_u8 小时前
kafka-3.8.0三节点集群(KRaft协议)
分布式·kafka