3791 字
19 分钟
学 Cloudflare 第二轮:AI 搜索、工作流、访问统计、AI 网关、分享封面和缩略图

上一篇总结 写到 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 的做法是「先查资料,再回答」:

  1. 建索引:把每段文字交给向量模型,变成 1024 个数字(相当于这段话的「意思坐标」),存进 Vectorize。意思相近的两段话,坐标也挨得近。
  2. 检索:把问题也变成坐标,找出最接近的 5 段。
  3. 生成:把这 5 段原文和问题一起交给聊天模型,要求它只按原文回答,并标出处。

如果最相近的段落也不够像,就直接回答「没写到」,连聊天模型都不调用,既省额度,又不会瞎编。

还踩了个小坑:Vectorize 的写入要排队。重建索引的接口返回「成功」,只代表请求被收下了,新文章大约 5 分钟后才搜得到。现在每天的自动发文流程会等新文章真的搜得到了,才算这一步完成。

免费额度:免费版就包含 Vectorize。查询按「(向量数 + 查询次数) × 维度」计量,每月 3000 万;按我现在的文章量,每月大约能问 600 多次。存储能放约 4800 段 1024 维的向量。超额只会报错,不会扣钱。

2. Workflows:投稿审核流水线#

一句话:Workflows 用来跑多步骤的长任务,每一步都会存档,任务可以中途睡觉,也可以停下来等人点按钮。

我做了什么:投稿审核演示。提交一段文字后,能实时看到它一步步往下走:

  1. 保存投稿
  2. AI 审核并写摘要(失败会自动重试)
  3. 睡 30 秒冷静期
  4. 等人点「批准」或「驳回」(10 分钟没人点就自动驳回)
  5. 记录结果

如果 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 KB0.17 秒
400 宽 WebP,第一次(现转)10 KB(小了 97%)0.91 秒
400 宽 WebP,第二次(读存好的)10 KB0.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 的#

这一轮新功能很多,但到现在一分钱都没花。我的做法是:

  1. 只用免费计划。免费计划超额的结果是报错,不会自动扣钱。我用的这几个功能,官方文档都写明了这一点,每次动手前我都会先查一遍最新的价格页。
  2. 自己设的上限比官方额度低。浏览器每天只用一半(5 分钟),缩略图每月只用五分之一(1000 张),Workflows 一天最多用 5%,AI 每天有次数上限。这样就算被人刷,也碰不到官方额度。
  3. 会花钱的开关一律不开。比如 AI Gateway 的 Guardrails、Logpush、第三方模型,Images 的付费存储。
  4. 能缓存就缓存,能只做一次就只做一次。AI 回答走网关缓存,封面和缩略图生成一次就存进 R2,统计面板缓存 5 分钟。
  5. R2 要格外小心。它绑了付款方式,所以新东西往 R2 里存之前,我都会先算一下量。缩略图每张才 10 KB 左右,离 10 GB 的免费存储还很远。异常监控也一直在盯着用量。
  6. 到点复查。12 月 1 日起日志的计费规则会变,我设了提醒,到时再核对一次。

这一轮的收获#

  1. AI 功能离不开「资料」和「缓存」:RAG 让 AI 只说博客里有的内容,网关缓存让重复的问题又快又不花额度。
  2. 异步要有耐心:Vectorize 写入要排队,Analytics Engine 要等一两分钟才查得到,「请求成功」不等于「马上生效」。
  3. 工具一多,先想清楚「谁能点」:访问码、人机验证、次数上限都要加,最好在功能上线时一起加。

下一步还没定。可能把其中某个功能拆成单独的详细笔记,也可能继续学新的。你要是也在学 Cloudflare,可以先从 上一篇 的基础部分看起。

学 Cloudflare 第二轮:AI 搜索、工作流、访问统计、AI 网关、分享封面和缩略图
https://blog.dogelover.online/posts/cloudflare-learning-summary-2/
作者
Dreamer
发布于
2026-10-10
许可协议
CC BY-NC-SA 4.0