Cloudflare Workflows 和 Queues 怎么选?
多步骤流程该用 Workflows 还是 Queues?这篇讲两者的核心差别是谁持有流程状态,以及怎样用 Queues 接入、用确定的实例 ID 做免费去重。
哈喽,我是颜sir,询盘自由网背后的人。做网络营销快6年,运气不错,实现了财务自由,目前全职在家钻研更多赚钱方法。在钻研过程中,我发现网上几乎找不到优质的中文资源。我深知新手入门需经历痛苦挣扎,所以创建了询盘自由网,把我知道的分享给你。
多步骤流程该用 Workflows 还是 Queues?这篇讲两者的核心差别是谁持有流程状态,以及怎样用 Queues 接入、用确定的实例 ID 做免费去重。
绑定把连接串换成配置里声明过的能力,代码通过 env 拿到已授权的对象。这篇讲清绑定的模型、wrangler.jsonc 的最小骨架和类型生成。
wrangler dev 默认在本机用本地模拟跑 Worker,绑定也是模拟的。这篇讲清本地、remote 绑定和 --remote 的区别,以及 .dev.vars 与 .env 的优先级。
wrangler 的 env 里 name、main 等字段可继承,绑定类字段不可继承,漏写的绑定在运行时才变成 undefined。这篇讲清规则、症状和 deploy 时的默认行为。
在 Worker 代码里 vars 和 secrets 都是 env.X,区别只在可见性。这篇讲清该放哪个、secret 怎么写入,以及 secrets.required 和变量限额。
用 effect/ai 的 LanguageModel 把 LLM 调用建模成一个服务:业务代码只依赖它,失败有名字,span 自带,换 provider 只是换 Layer。
AiError 只是一个壳,真正的信息在带 _tag 的 reason 里。用一个没有 default 的 switch 把十八种 reason 映射成四种领域错误,provider 新增 reason 时编译期就会报错。
用 Schedule 写指数退避加抖动,以 provider 给的 retryAfter 为下限,只重试 isRetryable 的错误;timeout 放在 retry 里面是每次尝试的预算,放外面是总预算。
用 LanguageModel.make 只实现 provider 那一层,回放一段脚本,再配合 TestClock,就能在不发任何网络请求的情况下测重试、错误映射和耗尽行为。
Effect.all 和 Effect.forEach 默认是顺序执行,不写 concurrency 就没有并发。反过来 "unbounded" 又会把所有任务同时放出去,forkDetach 则会让任务脱离父 fiber。
对任何错误无间隔地重试五次,只是在重复失败,还可能压垮已经过载的服务。重试前要先给错误分类,只重试瞬时错误,并配上退避和上限。
Effect.promise 假定 Promise 不会 reject,一旦 reject 就成了类型里看不见的缺陷。会失败的外部调用该用 tryPromise,并在 catch 里翻译成带标签的错误。
ManagedRuntime 把一个装配好的 Layer 变成可复用的运行环境,适合宿主自己拥有主循环的场景。这篇讲它何时构建、为什么必须 dispose,以及热重载下的妥协。
Workers 的环境绑定随每个请求而来,所以依赖要按生命周期分成两类。这篇讲清哪些放模块级 runtime、哪些在 fetch 里提供,以及 Effect.succeed 的求值时机陷阱。
catchTag 只认 _tag,catchIf 只认布尔,而真实的错误匹配常常既要判断又要取值。这篇讲清 Filter 与 Effect.catchFilter 怎么把「判断加提取」做成可组合的值。
Filter 不只给 catchFilter 用,数组、Option、Stream 上都有对应的用法。这篇讲清哪些 API 收 Filter,哪些只收布尔谓词,传错会发生什么。
用类型守卫构造 Filter 再交给 catchFilter,代码能通过编译,类型却声称某类错误已被全部处理,运行时它们照样失败。这篇讲清原因与两种规避办法。
错误外层是稳定的父错误、里层 reason 才是真正的失败原因时,用 Effect.catchReason 和 catchReasons 按两级 tag 恢复,不必再手写二级 switch。
用 Effect.catchReasons 按 StatusCodeError、TransportError 分别恢复 HttpClientError:404 当作不存在,传输失败当作离线,其余状态码继续失败。
不带兜底的 Effect.catchReasons,即使覆盖了全部 reason,结果类型里仍保留父错误。加兜底处理器或改用 unwrapReason,父错误才会真正消失。