上一篇总结 写到 Pages、Workers、KV、D1、R2、Turnstile、Cron 和异常监控。之后我又学了 Queues 和 Durable Objects,把访客计数器放进了侧边栏。接着从 10 月 9 日晚上到 10 月 10 日,又学了 6 个新功能:
- Vectorize:给博客做 AI 搜索
- Workflows:做了一条投稿审核流水线
- Analytics Engine:给博客加访问统计
- AI Gateway:给 AI 调用加缓存
- Browser Rendering:自动生成分享封面
- Cloudflare Images:给图床加缩略图
工具多了,口子也多了,所以我顺手把所有公开接口加固了一遍,还在 工具页 加了一块「实验室」,所有学习演示都能从那里打开。
每个功能都按同样的顺序写:一句话说它是什么 → 我做了什么 → 一个关键概念 → 免费额度和费用。
1. Vectorize + Workers AI:博客 AI 搜索
一句话:Vectorize 是一个向量数据库,能按「意思」找相近的文字,而不只是比对字面。
我做了什么:AI 搜博客,工具页上也有入口。用大白话提问,比如「留言板用了什么数据库?」,它会先在我的文章里找到相关段落,再让 AI 根据这些段落回答,并在答案后面附上出处文章。我把所有文章切成了几十小段,每段 400~600 字。问博客里没写过的内容(比如天气),它会老实回答「博客里暂时没写到」,不会瞎编。
关键概念:RAG(检索增强生成)。大模型并不知道我博客里写了什么,直接问它很容易编答案。RAG 的做法是「先查资料,再回答」:
- 建索引:把每段文字交给向量模型,变成 1024 个数字(相当于这段话的「意思坐标」),存进 Vectorize。意思相近的两段话,坐标也挨得近。
- 检索:把问题也变成坐标,找出最接近的 5 段。
- 生成:把这 5 段原文和问题一起交给聊天模型,要求它只按原文回答,并标出处。
如果最相近的段落也不够像,就直接回答「没写到」,连聊天模型都不调用,既省额度,又不会瞎编。
还踩了个小坑:Vectorize 的写入要排队。重建索引的接口返回「成功」,只代表请求被收下了,新文章大约 5 分钟后才搜得到。现在每天的自动发文流程会等新文章真的搜得到了,才算这一步完成。
免费额度:免费版就包含 Vectorize。查询按「(向量数 + 查询次数) × 维度」计量,每月 3000 万;按我现在的文章量,每月大约能问 600 多次。存储能放约 4800 段 1024 维的向量。超额只会报错,不会扣钱。
2. Workflows:投稿审核流水线
一句话:Workflows 用来跑多步骤的长任务,每一步都会存档,任务可以中途睡觉,也可以停下来等人点按钮。
我做了什么:投稿审核演示。提交一段文字后,能实时看到它一步步往下走:
- 保存投稿
- AI 审核并写摘要(失败会自动重试)
- 睡 30 秒冷静期
- 等人点「批准」或「驳回」(10 分钟没人点就自动驳回)
- 记录结果
如果 AI 判定是广告,就跳过 3、4 步直接驳回。我实测时故意让 AI 第一次失败,5 秒后它自动重试成功,然后正好睡满 30 秒,我点了批准,流程立刻跑完。投一条「加微信代购、月入十万」的广告,15 秒内就被驳回了。
关键概念:重放(replay)。Workflow 睡醒后,Cloudflare 会把整段代码从头再跑一遍,但已经做完的步骤不会真的再执行,而是直接拿存档的结果。所以写数据库、发邮件这类「做一次就够」的操作,一定要放在 step.do 里面,否则每重放一次就会再做一次。步骤名字也要固定,Cloudflare 靠名字认出「这一步做过了」。
免费额度:每天 3000 步,睡觉和等待都不算步数,也不占 CPU。我限制了每人每天 5 次、全站每天 30 次,一天最多用掉约 150 步,也就是额度的 5%。超额只会报错,不会扣钱。
3. Analytics Engine:博客访问统计
一句话:Analytics Engine 专门用来记大量事件,再用 SQL 按天、按页面、按国家分组统计。
我做了什么:访问统计面板。博客每打开一页就记一条,面板上能看到最近 7 天的每日浏览量、热门文章、访客国家、来源网站和设备类型。记录里不存 IP,爬虫也不算数。新的访问大约 1~2 分钟后出现在面板上,面板本身有 5 分钟缓存。
关键概念:采样。流量特别大时,Analytics Engine 不会每条都存,而是「存 1 条,记下它代表 N 条」。所以计数不能用 COUNT(),要用 SUM(_sample_interval) 把抽样补回来。个人博客的流量远到不了会被抽样的程度,但代码照正确的写法来。
这也是它和侧边栏计数器的分工:访客总数要精确,继续用 Durable Objects 计;「哪篇最火、读者从哪来」这类分析问题,交给 Analytics Engine。
免费额度:免费版每天能写 10 万条、查 1 万次,数据保留 3 个月。官方写明它目前还没开始收费。面板每 5 分钟最多查一次,怎么刷都用不完。
4. AI Gateway:给 AI 调用加缓存
一句话:AI Gateway 是放在程序和 AI 模型之间的一个中转站,能缓存、记录、限流每一次 AI 调用。
我做了什么:建了一个网关,AI 小助手和 AI 搜博客的模型调用现在都从它经过。代码几乎不用改,只是在调用模型时多传一个参数,指明走哪个网关。效果很明显:
| 场景 | 第一次 | 再问一次(命中缓存) |
|---|---|---|
| 翻译同一句话 | 约 2.3 秒 | 约 0.2 秒 |
| AI 搜博客问同一个问题 | 2 秒多 | 约 0.3 秒 |
缓存时间按用途分开设:翻译缓存 7 天,搜博客的回答缓存 1 天,聊天每次内容都不同,所以不缓存。另外加了每分钟最多 60 次的限流,作为第二道保险。我还做了一个兜底:万一网关出问题,程序会自动改成直接调用模型,功能不会挂。
关键概念:缓存键是「完整的请求」。模型、接口、请求内容必须一模一样才算同一个请求,差一个字都不行。缓存也是「尽力而为」:第一次请求后紧接着 0.6 秒内再发一次,并没有命中,因为结果还没来得及写进缓存,隔几秒再发就稳定命中了。
免费额度:日志、分析、缓存、限流这些核心功能都免费。命中缓存时不调用模型,也就不消耗 AI 额度。会收费或会吃额度的几项(调用第三方模型、Guardrails 内容审核、Logpush 日志推送)我都没开。12 月 1 日起日志的计费规则会变,到时我会再核对一次。
5. Browser Rendering:自动生成分享封面
一句话:Browser Rendering 让 Worker 在 Cloudflare 那边开一个看不见界面的 Chrome,用来截图、生成 PDF 或抓取网页。
我做了什么:分享封面生成器。现在把博客文章分享到微信、X 这些地方,会自动带一张封面图,上面有标题、简介和我的柴犬头像。封面本身就是一个 1200×630 的普通网页,用 CSS 排好版,再让浏览器截图,存进 R2。每篇只画一次:第一次大约 5 秒,之后直接读存好的图,只要 0.2~0.4 秒。每天自动发文时,新文章的封面也会顺手生成好。
关键概念:浏览器按「开着的时间」计费。用完必须马上关掉,不然它会空等 60 秒才自动关闭,这 60 秒全都算你的。所以关浏览器的代码写在 finally 里,中途出错也会关。批量生成时只开一次浏览器连画 5 篇,一共用了 3.7 秒,平均每篇 0.3 秒左右。
为了不被人拿来乱截别的网站,它只接受我博客的地址。我测了十几种坏输入(指向别的网站、内网地址、javascript: 之类),全部被拒绝。
免费额度:每天 10 分钟浏览器时间,部署加测试一共才用了 16 秒左右。我还设了上限,一天用满 5 分钟就停。额度用完只会报错,第二天早上 8 点(北京时间)恢复,不会扣钱。
6. Cloudflare Images:图床自动缩图
一句话:Cloudflare Images 能把图片缩小、转成 WebP 或 AVIF 这类更省流量的格式。
我做了什么:给 R2 图床加了缩略图。在图片地址后面加上 ?w=400&f=webp 这样的参数,就能拿到缩小并转好格式的版本。工具页的图床卡片上传后,会直接列出 200、400、800、1200 四种宽度的链接,可以一键复制成 Markdown。
| 请求 | 大小 | 耗时 |
|---|---|---|
| 原图 PNG(1200×630 的封面图) | 353 KB | 0.17 秒 |
| 400 宽 WebP,第一次(现转) | 10 KB(小了 97%) | 0.91 秒 |
| 400 宽 WebP,第二次(读存好的) | 10 KB | 0.19 秒 |
关键概念:参数白名单。宽度只允许固定的几档,格式也只有几种。如果允许任意宽度,别人用 w=1、w=2……w=5000 就能一下子刷光每月的免费转换次数。转好的图会存进 R2,同一种尺寸永远只转一次。
免费额度:免费版每月 5000 次不同的转换,超了只是新图转不出来,官方原话是免费版超额不收费。我自己卡在每月最多新建 1000 张缩略图,超限时直接显示原图,不会出现裂图。注意,Cloudflare Images 有两种用法:「把图存在 Cloudflare Images 里」要付费,「只做转换、图还放在自己的 R2 里」免费可用,我用的是后者。
7. 安全加固:把口子一个个补上
工具一多,能被别人乱用的地方也多了。我按「会不会花钱、会不会被滥用」排查了一遍,补了三类口子:
- 演示按钮加访问码:学习日报和异常监控的「手动跑一次」、发测试邮件的接口、访客计数器的「手动 +1」,以前谁都能点,现在必须先输访问码。第一次点会弹框让你输一次,之后浏览器会记住。侧边栏的访客计数和定时任务都不受影响。
- 短链接加 Turnstile 人机验证:防止别人借我的服务批量生成跳转到钓鱼网站的短链。
javascript:、内网地址这类危险网址也会被直接拒掉。 - 每日次数上限:短链接、AI 小助手、AI 搜博客共用一个 D1 数据库来计数。AI 小助手和 AI 搜博客每人每天 30 次,全站分别 300 次和 500 次,北京时间 0 点清零。计数只存打乱过(加盐哈希)的 IP,不存真实 IP。如果计数本身出错,就拒绝请求,宁严勿松。
一个体会:免费版额度用完一般只会报错,不会扣钱,但会让工具当天用不了,所以限流还是值得加。
8. 工具页「实验室」:一个入口找到所有演示
以前这些演示各有各的 workers.dev 地址,我自己都记不住。现在 工具页的实验室 把它们集中在一起:Workflows 投稿审核、Queues 任务队列、访客计数器、Cron 学习日报、异常监控和分享封面生成器。异常监控那里只显示状态,不放操作按钮。
到这里,工具页上的东西是这样分工的:
| 工具 | 用到的 Cloudflare 能力 |
|---|---|
| 短链接 | Workers + KV + Turnstile + D1 限流 |
| AI 小助手 | Workers AI + AI Gateway + D1 限流 |
| AI 搜博客 | Vectorize + Workers AI + AI Gateway + D1 限流 |
| 留言板 | D1 + Turnstile |
| 图床 | R2 + Images + Turnstile + 访问码 |
| 访问统计 | Analytics Engine |
| 分享封面 | Browser Rendering + R2 |
| 实验室 | Workflows、Queues、Durable Objects、Cron 等演示 |
小抄:Queues、Workflows、Cron、Durable Objects 怎么选
这四个最容易搞混,我自己是这么区分的:
| 工具 | 适合干什么 | 打个比方 | 我的例子 |
|---|---|---|---|
| Cron | 到点自动跑一次 | 闹钟:每天 8 点叫醒我,跑完就忘 | 学习日报、异常巡检 |
| Queues | 一大堆小任务排队慢慢处理,削峰 | 邮筒:信一股脑扔进去,再一封封处理 | 任务队列演示 |
| Durable Objects | 全世界唯一一份、绝对准确的共享状态 | 全球只有一个的计数器 | 侧边栏访客数 |
| Workflows | 多步骤、必须可靠跑完、中途可能要等很久的流程 | 工单:每道工序盖章存档,中途能等人签字 | 投稿审核 |
它们也可以组合使用:比如 Cron 每天定时触发,再开一个 Workflow 去慢慢跑完一整套流程。
我是怎么把费用保持在 0 的
这一轮新功能很多,但到现在一分钱都没花。我的做法是:
- 只用免费计划。免费计划超额的结果是报错,不会自动扣钱。我用的这几个功能,官方文档都写明了这一点,每次动手前我都会先查一遍最新的价格页。
- 自己设的上限比官方额度低。浏览器每天只用一半(5 分钟),缩略图每月只用五分之一(1000 张),Workflows 一天最多用 5%,AI 每天有次数上限。这样就算被人刷,也碰不到官方额度。
- 会花钱的开关一律不开。比如 AI Gateway 的 Guardrails、Logpush、第三方模型,Images 的付费存储。
- 能缓存就缓存,能只做一次就只做一次。AI 回答走网关缓存,封面和缩略图生成一次就存进 R2,统计面板缓存 5 分钟。
- R2 要格外小心。它绑了付款方式,所以新东西往 R2 里存之前,我都会先算一下量。缩略图每张才 10 KB 左右,离 10 GB 的免费存储还很远。异常监控也一直在盯着用量。
- 到点复查。12 月 1 日起日志的计费规则会变,我设了提醒,到时再核对一次。
这一轮的收获
- AI 功能离不开「资料」和「缓存」:RAG 让 AI 只说博客里有的内容,网关缓存让重复的问题又快又不花额度。
- 异步要有耐心:Vectorize 写入要排队,Analytics Engine 要等一两分钟才查得到,「请求成功」不等于「马上生效」。
- 工具一多,先想清楚「谁能点」:访问码、人机验证、次数上限都要加,最好在功能上线时一起加。
下一步还没定。可能把其中某个功能拆成单独的详细笔记,也可能继续学新的。你要是也在学 Cloudflare,可以先从 上一篇 的基础部分看起。