Workers KV Instant:把全球边缘键值读取压到 2 毫秒以内

2026-10-01 24 预计阅读时间: 1 分钟
来源: blog.cloudflare.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

Cloudflare 推出的 Workers KV Instant,目标是解决全球键值存储中两个直接影响用户体验的问题:冷读取延迟,以及数据跨区域传播速度。它提供低于 2 毫秒的 p99 读取延迟,并可在约 250 毫秒内将数据复制到 Cloudflare 的 300 多个边缘位置,同时继续使用开发者熟悉的 Workers KV API。

这意味着应用不必为了更快的读取路径重写数据访问层。不过,低延迟读取和全球复制仍然是两个不同指标,架构设计时不能把它们混为一谈。

变化不只是平均延迟更低

传统全球 KV 系统经常面临冷读取问题:某个键第一次在特定区域被访问时,数据可能尚未进入当地缓存,因此必须走更远的数据路径。平均延迟可能看起来不错,但偶发的冷读取会拉高 p95 或 p99,并直接反映到页面加载、鉴权和配置获取时间上。

KV Instant 的关键指标包括:

  • 低于 2 毫秒的 p99 读取延迟:关注的是尾部延迟,而不只是平均值。
  • 约 250 毫秒的全球复制速度:新数据可以快速传播到 300 多个边缘位置。
  • 消除冷读取惩罚:首次或低频读取不再需要承担明显更高的延迟。
  • 沿用 Workers KV API:现有应用的数据访问代码可以保持相同的编程模型。

这里需要区分三个时间:KV 本身的读取时间、Worker 执行时间,以及用户到边缘节点的网络时间。低于 2 毫秒描述的是存储读取能力,并不等于浏览器看到的完整 HTTP 请求一定会在 2 毫秒内结束。

哪些数据最适合放进去

KV Instant 更适合“读多写少、需要全球就近访问”的数据。例如:

  • 功能开关和动态配置;
  • 路由规则、重定向表和租户配置;
  • API 请求所需的静态元数据;
  • 已计算完成、可以按键直接返回的结果;
  • 不要求强一致性的会话辅助信息;
  • AI 应用中的模型路由、提示词版本和策略配置。

相反,如果业务要求跨区域强一致事务、原子计数器或写入后立即在全球所有位置读取到最新值,就不能只依据读取延迟选择 KV。250 毫秒全球复制是传播速度指标,不应被解释为强一致性承诺。支付余额、库存扣减和唯一性约束等数据,仍应由支持对应一致性语义的数据库负责。

用熟悉的 Workers KV API 构建配置服务

下面是一个可以改造的最小 Worker。示例假设已经创建可供 KV Instant 使用的命名空间,并将其绑定为 CONFIG。实际创建和绑定方式应以账户中提供的产品配置为准;需要替换配置里的命名空间 ID。

项目结构:

kv-instant-demo/
├── package.json
├── wrangler.toml
└── src/
    └── index.js

package.json:

{
  "name": "kv-instant-demo",
  "private": true,
  "scripts": {
    "dev": "wrangler dev",
    "deploy": "wrangler deploy"
  },
  "devDependencies": {
    "wrangler": "latest"
  }
}

wrangler.toml:

name = "kv-instant-demo"
main = "src/index.js"
compatibility_date = "2025-01-01"

[[kv_namespaces]]
binding = "CONFIG"
id = "替换为你的命名空间_ID"

src/index.js:

function json(data, status = 200) {
  return new Response(JSON.stringify(data), {
    status,
    headers: {
      "content-type": "application/json; charset=utf-8",
      "cache-control": "no-store"
    }
  });
}

export default {
  async fetch(request, env) {
    const url = new URL(request.url);

    if (!url.pathname.startsWith("/config/")) {
      return json({ error: "Not found" }, 404);
    }

    let key;
    try {
      key = decodeURIComponent(url.pathname.slice("/config/".length));
    } catch {
      return json({ error: "Invalid key encoding" }, 400);
    }

    if (!key) {
      return json({ error: "A config key is required" }, 400);
    }

    if (request.method === "GET") {
      const value = await env.CONFIG.get(key, { type: "json" });

      if (value === null) {
        return json({ error: "Key not found", key }, 404);
      }

      return json({ key, value });
    }

    if (request.method === "PUT") {
      let value;
      try {
        value = await request.json();
      } catch {
        return json({ error: "Request body must be valid JSON" }, 400);
      }

      await env.CONFIG.put(key, JSON.stringify(value));

      // 202 强调写入已接受,但不暗示全球节点已经同步完成。
      return json({ accepted: true, key }, 202);
    }

    return json({ error: "Method not allowed" }, 405);
  }
};

安装并部署:

npm install
npm run deploy

部署后可以写入和读取配置。把域名替换为实际 Worker 地址:

export WORKER_URL="https://kv-instant-demo.example.workers.dev"

curl -i -X PUT \
  -H 'content-type: application/json' \
  --data '{"checkout_v2":true,"rollout":25}' \
  "$WORKER_URL/config/feature-flags"

curl -sS "$WORKER_URL/config/feature-flags"

生产环境不应直接开放这个写入接口。至少需要加入身份认证、授权、请求大小限制和审计日志;更常见的做法是只允许内部管理系统写入,而公开 Worker 只负责读取。

不要用一次 curl 判断 2 毫秒目标

端到端请求包含 DNS、TLS、互联网链路、Worker 调度、JSON 编解码和 KV 读取。要观察实际用户体验,可以先测量完整 HTTP 请求的 p99,再通过平台观测数据区分各阶段耗时。

下面的脚本会连续请求 200 次,并计算客户端观察到的近似 p99:

export URL="https://kv-instant-demo.example.workers.dev/config/feature-flags"

for i in $(seq 1 200); do
  curl -o /dev/null -sS -w '%{time_total}\n' "$URL"
done | sort -n | awk '
  { samples[NR] = $1 }
  END {
    index = int(NR * 0.99 + 0.999)
    printf "requests=%d client_p99=%.3f ms\n", NR, samples[index] * 1000
  }
'

这个结果是客户端端到端 p99,不是 KV 存储层 p99。若要比较迁移前后的效果,应固定测试地点、请求数量、键大小和访问分布,并分别测试高频键与低频键。否则网络波动很容易掩盖存储层改进。

采用时关注四件事

KV Instant 最大的工程价值,是在保留 Workers KV 编程接口的同时压低尾部读取延迟并加快全球传播。迁移或新项目接入时,可以按下面的清单推进:

  1. 筛选数据:优先迁移读多写少、允许短暂传播窗口的数据。
  2. 保持接口边界:把 KV 访问封装在仓储层,避免业务代码依赖具体绑定名称。
  3. 验证尾部延迟:同时监控存储读取耗时和端到端 p95、p99,而不是只看平均值。
  4. 明确一致性要求:不要让依赖强一致性的余额、计数器或库存逻辑落入全球 KV。

对于功能配置、边缘路由和全球元数据读取,低于 2 毫秒的 p99 与约 250 毫秒的全球复制组合非常有吸引力。真正稳妥的采用方式,是先选择一组可容忍短暂传播时间的键进行灰度,对比尾部延迟和错误率,再逐步扩大范围。


相关推荐