从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 阅读更多 →

最新新闻

R语言多分类逻辑回归变量筛选:最优子集与逐步回归实战

R语言多分类逻辑回归变量筛选:最优子集与逐步回归实战

当你面对一个包含数十个潜在预测变量的数据集,想要构建一个稳健的多分类预测模型时,最让你头疼的是什么?是模型精度总是不尽如人意,还是模型复杂到难以解释,甚至出现过拟合?很多数据分析师和研究者会不假思…

2026/7/5 12:11:45 阅读更多 →
R语言多分类逻辑回归特征筛选:逐步回归与Lasso实战指南

R语言多分类逻辑回归特征筛选:逐步回归与Lasso实战指南

1. 先搞清楚多分类逻辑回归里“最优子集”和“逐步回归”到底在解决什么问题如果你正在用R语言处理一个多分类问题,比如预测客户流失等级(高、中、低)、疾病分型(A、B、C)或者产品品类偏好,逻辑回归&#x…

2026/7/5 12:11:45 阅读更多 →
贝叶斯决策实战:从最小错误到最小风险,如何为你的AI模型选择最优策略?

贝叶斯决策实战:从最小错误到最小风险,如何为你的AI模型选择最优策略?

1. 贝叶斯决策:从直觉到数学公式第一次听说贝叶斯决策时,我正坐在工位上调试一个图像分类模型。当时遇到一个奇怪的现象:模型在测试集上准确率很高,但实际部署时总把一些重要客户照片误分类。主管走过来看了一眼说:&qu…

2026/7/5 12:07:44 阅读更多 →
SVM 核技巧实战:3步验证自定义核函数正定性(附Gram矩阵代码)

SVM 核技巧实战:3步验证自定义核函数正定性(附Gram矩阵代码)

SVM核函数实战:从零验证自定义核的正定性(附Python代码)引言在机器学习领域,支持向量机(SVM)因其出色的分类性能而广受青睐。但当面对非线性可分数据时,传统的线性SVM就显得力不从心。核技巧&am…

2026/7/5 12:07:44 阅读更多 →
Simulink RL Agent 模块实战:5步连接物理模型与DDPG智能体

Simulink RL Agent 模块实战:5步连接物理模型与DDPG智能体

Simulink RL Agent 模块实战:5步连接物理模型与DDPG智能体在工业控制和机器人领域,将物理系统模型与强化学习算法相结合已成为实现智能控制的重要途径。MATLAB/Simulink平台凭借其强大的建模能力和与强化学习工具箱的无缝集成,为工程师提供了…

2026/7/5 12:07:44 阅读更多 →
大模型训练实战:从入门到部署的完整指南

大模型训练实战:从入门到部署的完整指南

1. 大模型训练入门:为什么每个程序员都应该掌握这项技能 2026年的技术圈,不会训练大模型就像2010年不会写网页一样尴尬。我花了三个月从零开始啃下这块硬骨头,现在可以负责任地告诉你:训练自己的大模型没有想象中那么难&#xff0…

2026/7/5 12:05:44 阅读更多 →

日新闻

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 阅读更多 →

月新闻