从0到1:使用Job Iteration重构长时运行的Rails后台任务
从0到1使用Job Iteration重构长时运行的Rails后台任务【免费下载链接】job-iterationMakes your background jobs interruptible and resumable by design.项目地址: https://gitcode.com/gh_mirrors/jo/job-iterationJob Iteration是一个为ActiveJob设计的扩展能让你的后台任务具备可中断和可恢复能力通过设计保存任务的所有进度也称为作业检查点。对于处理大量数据或长时间运行的Rails后台任务Job Iteration提供了可靠的解决方案确保任务在面对部署、服务器重启或云环境中断时不会丢失进度。为什么需要Job Iteration想象以下简单的Rails后台任务class SimpleJob ApplicationJob def perform User.find_each do |user| user.notify_about_something end end end当用户数量较少时这个任务会很快完成。但随着数据增长处理数百万用户可能需要数小时甚至数天。在频繁部署和 worker 重启的情况下任务可能会丢失或从头开始导致部分记录被重复处理。云环境同样不可预测——AWS实例可能被标记为不健康需要重启Kubernetes Pod可能被驱逐。这些情况都会导致任务进度丢失。Job Iteration正是为解决这些问题而设计已在Shopify的生产环境中稳定运行多年。快速开始将普通任务转换为可中断任务安装与配置首先将gem添加到你的Gemfilegem job-iteration执行安装命令bundle install基本重构步骤将传统的ActiveJob任务重构为Job Iteration任务只需两步包含JobIteration::Iteration模块用build_enumerator和each_iteration方法替代perform方法重构前class NotifyUsersJob ApplicationJob def perform User.find_each do |user| user.notify_about_something end end end重构后class NotifyUsersJob ApplicationJob include JobIteration::Iteration def build_enumerator(cursor:) enumerator_builder.active_record_on_records( User.all, cursor: cursor, ) end def each_iteration(user) user.notify_about_something end endeach_iteration方法会为User.all关系中的每个用户调用关系将按主键排序与find_each行为一致。进阶使用场景1. 批处理记录当需要处理大量记录时可以使用批处理模式减少数据库查询次数class BatchesJob ApplicationJob include JobIteration::Iteration def build_enumerator(product_id, cursor:) enumerator_builder.active_record_on_batches( Comment.where(product_id: product_id).select(:id), cursor: cursor, batch_size: 100, ) end def each_iteration(batch_of_comments, product_id) comment_ids batch_of_comments.map(:id) CommentService.call(comment_ids: comment_ids) end end2. 处理CSV文件Job Iteration提供了CSV枚举器轻松处理大型CSV导入class CsvJob ApplicationJob include JobIteration::Iteration def build_enumerator(import_id, cursor:) import Import.find(import_id) enumerator_builder.csv(import.csv, cursor: cursor) end def each_iteration(csv_row, import_id) # 处理CSV行数据 end end3. 嵌套迭代处理多层级数据时可以使用嵌套枚举器class NestedIterationJob ApplicationJob include JobIteration::Iteration def build_enumerator(cursor:) enumerator_builder.nested( [ -(cursor) { enumerator_builder.active_record_on_records(Shop.all, cursor: cursor) }, -(shop, cursor) { enumerator_builder.active_record_on_records(shop.products, cursor: cursor) }, -(_shop, product, cursor) { enumerator_builder.active_record_on_batch_relations(product.product_variants, cursor: cursor) } ], cursor: cursor ) end def each_iteration(product_variants_relation) # 处理产品变体数据 end end最佳实践单条记录处理优于批处理尽管Job Iteration支持批处理但单条记录处理允许更频繁的中断点提高任务的可恢复性# 推荐单条记录处理 class RecordsJob ApplicationJob include JobIteration::Iteration def build_enumerator(product_id, cursor:) enumerator_builder.active_record_on_records( Comment.where(product_id: product_id), cursor: cursor, batch_size: 5, ) end def each_iteration(comment, product_id) comment.destroy end end控制每次迭代时间确保each_iteration方法执行时间不超过30秒这有助于在收到中断信号时能够及时保存进度# config/initializers/instrumentation.rb ActiveSupport::Notifications.monotonic_subscribe(each_iteration.iteration) do |_, started, finished, _, tags| elapsed finished - started if elapsed 25 # 25秒阈值 Rails.logger.warn [Iteration] job_class#{tags[:job_class]} 迭代时间超过限制 end end设置最大作业运行时间即使没有外部中断也建议定期中断长时任务以释放worker资源# 全局设置 JobIteration.max_job_runtime 5.minutes # 按任务设置 class MyJob ApplicationJob include JobIteration::Iteration self.job_iteration_max_job_runtime 3.minutes end支持的队列适配器与环境Job Iteration支持主流的队列适配器无需额外配置即可实现优雅中断ResqueSidekiqGoodJobSolid QueueAmazon SQSDelayed::Job环境要求Ruby 3.1及以上Rails 7.0及以上深入学习资源Iteration工作原理作业参数语义自定义枚举器任务限流通过Job Iteration你可以构建更健壮、更可靠的Rails后台任务轻松应对云环境的不确定性和数据增长的挑战。开始使用Job Iteration让你的后台任务具备企业级的可靠性【免费下载链接】job-iterationMakes your background jobs interruptible and resumable by design.项目地址: https://gitcode.com/gh_mirrors/jo/job-iteration创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

探索Veloren:如何体验这款开源像素RPG的无限魅力?

探索Veloren:如何体验这款开源像素RPG的无限魅力?

探索Veloren:如何体验这款开源像素RPG的无限魅力? 【免费下载链接】veloren An open world, open source voxel RPG inspired by Dwarf Fortress and Cube World. This repository is a mirror. Please submit all PRs and issues on our GitLab page. …

2026/7/5 7:41:38 阅读更多 →
android-ndk-rs未来展望:新特性与社区发展路线图

android-ndk-rs未来展望:新特性与社区发展路线图

android-ndk-rs未来展望:新特性与社区发展路线图 【免费下载链接】ndk 项目地址: https://gitcode.com/gh_mirrors/an/android-ndk-rs android-ndk-rs是一个为Android NDK提供Rust绑定的开源项目,旨在帮助开发者使用Rust语言高效开发Android应用…

2026/5/17 8:53:32 阅读更多 →
Lovefield终极性能调优指南:10个技巧让你的Web数据库运行更快

Lovefield终极性能调优指南:10个技巧让你的Web数据库运行更快

Lovefield终极性能调优指南:10个技巧让你的Web数据库运行更快 【免费下载链接】lovefield Lovefield is a relational database for web apps. Written in JavaScript, works cross-browser. Provides SQL-like APIs that are fast, safe, and easy to use. 项目地…

2026/7/4 6:03:31 阅读更多 →

最新新闻

Linux 守护进程创建 7 步法:从 fork 到 setsid 的完整 C 语言实现

Linux 守护进程创建 7 步法:从 fork 到 setsid 的完整 C 语言实现

Linux 守护进程创建 7 步法:从 fork 到 setsid 的完整 C 语言实现1. 守护进程的核心概念与设计哲学守护进程(Daemon)是Linux系统中一类特殊的后台服务进程,它们通常在系统启动时自动运行,独立于任何用户终端&#xff0…

2026/7/5 11:07:18 阅读更多 →
基于Hermes Agent与Harness Engineering构建企业级AI Agent应用

基于Hermes Agent与Harness Engineering构建企业级AI Agent应用

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在实际企业级 AI 大模型应用开发中,将大语言模型(LLM)的能力稳定、可靠地集成到业务流程里&#x…

2026/7/5 11:05:18 阅读更多 →
基于协同过滤的SpringBoot+Vue商品推荐系统:从算法原理到工程实践

基于协同过滤的SpringBoot+Vue商品推荐系统:从算法原理到工程实践

这次我们来看一个基于协同过滤算法的商品推荐系统,这是一个典型的Java Web毕业设计/课程实践项目。项目采用SpringBoot Vue MySQL MyBatis的技术栈,实现了从用户行为数据采集到个性化商品推荐的全流程。对于正在学习Java后端开发、SpringBoot框架&…

2026/7/5 11:01:17 阅读更多 →
动作游戏开发:UE与Unity双引擎核心技术与实践指南

动作游戏开发:UE与Unity双引擎核心技术与实践指南

1. 动作游戏开发的核心预备知识体系作为从业十余年的游戏开发者,我经常被问到一个问题:"想开发一款UD(Unreal/Unity双引擎)动作游戏,应该从哪里开始准备?"这个问题看似简单,但实际上包…

2026/7/5 10:59:16 阅读更多 →
AI大模型API的CC攻击防御:构建多层算力防线与实战方案

AI大模型API的CC攻击防御:构建多层算力防线与实战方案

1. 项目概述:当AI算力成为攻击目标最近和几个做AI应用开发的朋友聊天,发现大家普遍遇到了一个头疼的新问题:自己辛辛苦苦搭建、调优的大模型API服务,上线没多久,访问量就异常飙升,服务器CPU和GPU瞬间拉满&a…

2026/7/5 10:57:16 阅读更多 →
Linux磁盘挂载:用UUID彻底解决盘符漂移,保障系统稳定

Linux磁盘挂载:用UUID彻底解决盘符漂移,保障系统稳定

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在服务器运维和日常开发中,给 Linux 系统挂载新硬盘是一项基础但至关重要的操作。很多朋友,尤其是刚接触 Linu…

2026/7/5 10:57:16 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻