Redwood 实战:基于 Exec 命令与 Faktory 构建持久化后台任务 Worker
后端前端Web框架开发工具【免费下载链接】redwoodRedwoodGraphQL项目地址https://gitcode.com/gh_mirrors/re/redwood点击查看免费下载在本篇技术指南中我们将围绕 Redwood 的execCLI 命令完整演示如何借助 Faktory 这一语言无关的持久化后台任务服务器构建一个可以脱离请求/响应周期运行的异步 Worker从生成脚本、注册任务、配置环境变量到在 Service 中投递任务、最终启动 Worker 消费任务全流程可复制可运行。读完本文你将掌握在 Redwood 应用中落地注册后发欢迎邮件这类后台任务的完整实现方案并理解yarn rw exec的底层执行机制。为什么需要后台任务与 Faktory在典型的 Web 应用中一些操作如发送欢迎邮件、同步第三方数据、清理过期数据并不适合阻塞在 GraphQL Mutation 的请求/响应周期里。它们耗时长、依赖外部服务一旦失败还会拖垮用户请求。这类工作最适合放到后台异步执行。Faktory 是一个语言无关language-agnostic、持久化的后台任务服务器它本身与语言无关任何语言的客户端都可以与它通信任务数据被持久化保存即使 Worker 进程崩溃任务也不会丢失。在 Redwood 应用中我们通过faktory-worker这个 Node 客户端库与 Faktory 服务器通信——Worker 端用它注册并消费任务应用端Service用它把任务投递到服务器。整体架构分为三部分Faktory 服务器负责接收、排队并持久化任务可用 Docker 一键启动Redwood Worker 脚本由yarn rw g script生成的 Node 脚本注册任务处理器长驻运行等待消费任务Redwood 应用在 Service如注册逻辑中把任务推送到 Faktory 服务器。第一步生成 Worker 脚本Redwood 的generate script命令会在./scripts/name下生成一个可独立执行的 Node.js 脚本文件。打开终端执行yarn rw g script faktoryWorker生成器会输出类似如下的提示告诉我们如何调用这个脚本✔ Generating script file... ✔ Successfully wrote file ./scripts/faktoryWorker.ts ✔ Next steps... After modifying your script, you can invoke it like: yarn rw exec faktoryWorker yarn rw exec faktoryWorker --param1 true从生成器模板见 script.ts.template可以看出脚本默认结构如下脚本默认导出函数接收{ args }其中args._是位置参数数组其余为具名参数// Append api/* to import from api and web/* to import from web // To access your database uncomment the line below // import { db } from api/src/lib/db interface Args { _: string[] [key: string]: unknown } export default async ({ args }: Args) { // Your script here... console.log(:: Executing script with args ::) console.log(args) }关键点在于脚本中可以使用api/src/...前缀导入 API 侧的服务与库如$api/src/lib/logger、api/src/lib/db这正是 Worker 能复用 Redwood 业务代码的基础。如果你的项目启用了 TypeScript生成器会自动生成.ts文件参见 generate script 文档。第二步注册任务处理器编辑scripts/faktoryWorker.js用faktory-worker注册一个名为postSignupTask的任务并在默认导出函数中启动 Worker 长驻进程const { postSignupTask } from $api/src/lib/tasks import { logger } from $api/src/lib/logger import faktory from faktory-worker faktory.register(postSignupTask, async (taskArgs) { logger.info(running postSignupTask in background worker) await postSignupTask(taskArgs) }) export default async ({ _args }) { const worker await faktory .work({ url: process.env.FAKTORY_URL, }) .catch((error) { logger.error(worker failed to start: ${error}) process.exit(1) }) worker.on(fail, ({ _job, error }) { logger.error(worker failed to start: ${error}) }) }逐段解读这段代码faktory.register(postSignupTask, ...)向 Worker 注册任务名称及其处理函数。Faktory 服务器推送过来名为postSignupTask的任务时会执行这里注册的异步回调faktory.work({ url: process.env.FAKTORY_URL })让 Worker 连接 Faktory 服务器并开始消费任务连接地址来自环境变量FAKTORY_URL连接失败时记录错误并process.exit(1)退出worker.on(fail, ...)监听单个任务执行失败事件便于集中记录失败原因示例代码中的日志文案与启动失败相同实际项目中可改为任务执行失败等更贴切的描述。目前这段代码还不能运行因为postSignupTask还没有在api/src/lib/tasks.js中定义FAKTORY_URL也还没有配置。第三步配置 FAKTORY_URL在项目根目录的.env文件中设置FAKTORY_URL指向你的 Faktory 服务器地址FAKTORY_URLtcp://localhost:7419Faktory 默认监听 7419 端口Web UI 默认在 7420。如果使用 Docker 启动服务器请确认端口映射与本配置一致。只有FAKTORY_URL配置正确、服务器在线Worker 才能启动并消费任务。第四步实现后台任务在api/src/lib/tasks.js中实现postSignupTask。这个函数负责真正执行后台工作例如调用外部邮件服务发送欢迎邮件——这类耗时、依赖外部网络的操作正适合放到后台export const postSignupTask async ({ userId, emailPayload }) { // Send a welcome email to new user. // Youll have to have an integration with an email service for this to work. await sendEmailWithTemplate({ ...emailPayload, TemplateModel: { ...emailPayload.TemplateModel, }, }) }这里sendEmailWithTemplate是对邮件服务商的封装实际项目需自行实现或接入第三方服务。函数接收{ userId, emailPayload }作为任务参数这两个字段正是后续从 Service 投递任务时传入的数据。由于tasks.js位于api/src/libWorker 脚本通过$api/src/lib/tasks导入即可复用同一份实现业务逻辑只写一次。第五步在 Service 中投递任务任务定义好后需要在合适的业务节点把它投递出去。对postSignupTask来说最合理的位置是用户完成注册之后——通常是会被 GraphQL Mutation 调用的 Service。下面是一个src/services/auth/auth.js的示例const faktory require(faktory-worker) export const signUp async ({ input }) { // Perform all the signup operations, such as creating an entry in the DB and auth provider // ... // Then, send our task to the Faktory server const client await faktory.connect() await client.job(postSignupTask, { ...taskArgs }).push() await client.close() }这段代码的关键动作faktory.connect()建立到 Faktory 服务器的客户端连接地址同样取自FAKTORY_URLclient.job(postSignupTask, { ...taskArgs }).push()将postSignupTask任务连同参数推送到服务器。Faktory 会持久化该任务并等待 Worker 消费client.close()投递完成后关闭连接释放资源。注意这里的任务参数taskArgs会作为taskArgs传给 Worker 中的处理函数因此在postSignupTask实现中解构的{ userId, emailPayload }必须与这里投递的数据结构保持一致。至此一条完整的后台任务链路已经打通用户注册 → Service 投递任务到 Faktory → Worker 消费任务 → 执行postSignupTask发送欢迎邮件。启动服务器并运行 Worker先用 Docker 启动 Faktory 服务器需要提前安装 Docker 并拉取 Faktory 镜像映射好 7419 端口然后在项目根目录运行 Workeryarn rw exec faktoryWorker如果 Faktory 服务器在线、FAKTORY_URL配置正确你会看到服务器拾取 Service 投递的任务Worker 进程随即消费并处理这些任务。exec命令本身提供了一些实用选项定义见 exec.js选项别名默认值说明name位置参数——要运行的脚本文件名扩展名可省略--prisma—true运行脚本前是否生成 Prisma Client--list-lfalse仅列出所有可用脚本不执行--silent-sfalse静默 Redwood 自身的输出只保留脚本输出例如查看当前项目有哪些脚本可以运行yarn rw exec --listexec 底层是如何工作的理解exec的执行机制有助于排查脚本运行问题。核心实现在 execHandler.js其处理流程大致如下定位脚本通过findScripts扫描scripts/目录下的所有脚本文件并按文件名去扩展名分组未指定脚本名或使用--list时会列出所有可用脚本解析参数CLI 通过 yargs 解析命令exec [name]会把脚本名放入name变量其余位置参数进入args._并剔除exec与$0具名参数如--firstParam hello则作为属性传入最终组合成传给脚本的args对象注册 Babel 钩子脚本中$api/src/...、api/src/...这类别名导入之所以可用是因为执行器注册了 API 侧的 Babel 转换钩子registerApiSideBabelHook让脚本在运行时能解析 Redwood 的路径别名与 ESM 语法生成 Prisma Client默认在运行前生成 Prisma Client可通过--prisma false关闭保证脚本中使用db时数据库访问可用执行脚本调用脚本默认导出的异步函数传入解析好的args。官方文档对exec的定位是执行yarn redwood generate script name生成的脚本用于一次性操作、长任务或工具脚本见 exec 章节典型场景包括将 Stripe 产品同步到数据库的一次性脚本、可离线处理长任务的后台 Worker、开发期的自定义种子数据脚本等。更进一步的参考如果你希望深入了解generate script的参数选项如--typescript、--rollback参见 CLI 命令参考运行exec时如果想观察脚本收到的参数可在脚本内console.log(args)执行yarn rw exec faktoryWorker foo --firstParam hello即可看到{ _: [foo], firstParam: hello }形式的输出若项目需要更框架化、内建的后台任务能力与 Prisma 深度集成、自带重试与队列管理可进一步阅读 background-jobs.md将其与本文的Exec Faktory轻量方案对比选型。小结本文完整演示了在 Redwood 中使用execCLI 命令与 Faktory 搭建后台 Worker 的五个步骤生成脚本、注册任务、配置FAKTORY_URL、实现任务函数、在 Service 中投递任务并最终通过yarn rw exec faktoryWorker启动消费。这套方案把耗时操作从请求/响应周期中剥离同时借助 Faktory 的持久化能力保证任务不丢失是 Redwood 应用处理发送邮件、同步第三方数据等异步工作的实用选择。赞分享后端前端Web框架开发工具【免费下载链接】redwoodRedwoodGraphQL项目地址https://gitcode.com/gh_mirrors/re/redwood点击查看免费下载相关推荐Redwood 实战基于 Exec 命令与 Faktory 构建后台任务 WorkerRedwood 实战基于 Exec 命令与 Faktory 构建后台任务 Worker 本文是一份面向 Redwood 应用开发者的实战指南核心主题是借助后端前端Web框架开发工具Redwood 后台任务实战使用 exec 命令与 Faktory 构建后台 WorkerRedwood 后台任务实战使用 exec 命令与 Faktory 构建后台 Worker 导读 本文基于 Redwood 官方 How To 文档 doc后端前端Web框架开发工具Redwood 后台任务实战用 exec 命令与 Faktory 构建后台 Workerversion 4.xRedwood 后台任务实战用 exec 命令与 Faktory 构建后台 Workerversion 4.x 本文是一份面向 Redwood 应用开发者后端前端Web框架开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PCB数字地与模拟地分离原理与实战策略

PCB数字地与模拟地分离原理与实战策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 5:48:03 阅读更多 →
Undo Log:事务回滚是怎么实现的?

Undo Log:事务回滚是怎么实现的?

回滚要解决什么 事务执行到一半报错了,或者用户主动敲了 ROLLBACK,已经改掉的那些数据得变回去。 怎么变回去有两条路: 改之前先把整个页或者整行拷一份,回滚的时候原样写回去记下"这次修改的反向操作是什么"&#xff0…

2026/9/24 5:48:03 阅读更多 →
RT-Thread 在 GD32VF103V_EVAL(RISC-V 内核)上的 BSP 移植与实践指南

RT-Thread 在 GD32VF103V_EVAL(RISC-V 内核)上的 BSP 移植与实践指南

操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本指南围…

2026/9/24 5:48:03 阅读更多 →

最新新闻

小米刷机卡Fastboot?VAB/AB分区脚本适配与实操指南

小米刷机卡Fastboot?VAB/AB分区脚本适配与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:34:33 阅读更多 →
TMC5160+STM32步进电机驱动:SPI配置全流程实战与避坑指南

TMC5160+STM32步进电机驱动:SPI配置全流程实战与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:34:33 阅读更多 →
CCDE 400-007 官方指南:资深网络架构师的设计决策训练手册

CCDE 400-007 官方指南:资深网络架构师的设计决策训练手册

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:34:33 阅读更多 →
DSP56800实时控制开发实战:CodeWarrior环境搭建与硬核调试

DSP56800实时控制开发实战:CodeWarrior环境搭建与硬核调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:34:32 阅读更多 →
嵌入式作业2

嵌入式作业2

STM32F103C8T6 流水灯实验报告 一、实验目的 掌握 STM32F103C8T6 最小系统核心板的 GPIO 端口寄存器结构与地址映射。学会使用 C 语言直接操作寄存器的方式配置 GPIO 端口为推挽输出模式。理解 GPIO 端口时钟使能、端口配置寄存器(CRL/CRH)、输出数据寄存…

2026/9/24 6:34:32 阅读更多 →
FPGA高速接口设计核心:ISERDES/OSERDES原理与工程实践

FPGA高速接口设计核心:ISERDES/OSERDES原理与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:33:32 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →