关于 active-job-coder
为 Ruby on Rails 编码 Agent 提供 Active Job 的设计与重构指导,重点包括队列策略、重试、并发控制、定时执行和幂等性。
主要功能
- 01按单一职责设计 Job
- 02传递 ID 并获取最新对象
- 03设置队列与优先级
- 04配置重试、丢弃和错误处理
- 05控制并发并安排延迟任务
适用场景
- 01创建邮件发送或订单处理任务
- 02为外部 API 调用设置重试策略
- 03安排提醒任务并批量入队
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill active-job-coder安装后在 Claude Code 中输入/active-job-coder确认已加载。
详细介绍
Active Job 编码器
作业设计原则
1. 单一职责
# Good: Focused job
class SendWelcomeEmailJob < ApplicationJob
queue_as :default
def perform(user)
UserMailer.welcome(user).deliver_now
end
end
2. 传递 ID,而非对象
# Good: Pass identifiers
class ProcessOrderJob < ApplicationJob
def perform(order_id)
order = Order.find(order_id)
# Process order
end
end
3. 队列配置
class CriticalNotificationJob < ApplicationJob
queue_as :critical
queue_with_priority 1 # Lower = higher priority
end
class ReportGenerationJob < ApplicationJob
queue_as :low_priority
queue_with_priority 50
end
错误处理与重试策略
class ExternalApiJob < ApplicationJob
queue_as :default
retry_on Net::OpenTimeout, wait: :polynomially_longer, attempts: 5
retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
discard_on ActiveJob::DeserializationError
def perform(record_id)
record = Record.find(record_id)
ExternalApi.sync(record)
end
end
自定义错误处理
class ImportantJob < ApplicationJob
rescue_from StandardError do |exception|
Rails.logger.error("Job failed: #{exception.message}")
ErrorNotifier.notify(exception, job: self.class.name)
raise # Re-raise to trigger retry
end
end
并发控制(Solid Queue)
class ProcessUserDataJob < ApplicationJob
limits_concurrency key: ->(user_id) { user_id }, duration: 15.minutes
def perform(user_id)
user = User.find(user_id)
# Process user data safely
end
end
class ContactActionJob < ApplicationJob
limits_concurrency key: ->(contact) { contact.id },
duration: 10.minutes,
group: "ContactActions"
end
调度与延迟执行
SendReminderJob.perform_later(user) # Immediate
SendReminderJob.set(wait: 1.hour).perform_later(user) # Delayed
SendReminderJob.set(wait_until: Date.tomorrow.noon).perform_later(user) # Scheduled
# Bulk enqueue
ActiveJob.perform_all_later(users.map { |u| SendReminderJob.new(u.id) })
应避免的反模式
| 反模式 | 问题 | 解决方案 |
|---|---|---|
| 作业臃肿 | 难以测试和维护 | 将逻辑提取到模型类中 |
| 序列化对象 | 开销大、数据过时 | 传递 ID,获取最新数据 |
| 没有重试策略 | 故障静默发生 | 使用带退避策略的 retry_on |
| 同步调用 | 阻塞请求 | 始终使用 perform_later |
| 没有幂等性 | 重复处理 | 将作业设计为可重复运行 |
| 忽略错误 | 故障静默发生 | 使用带日志记录的 rescue_from |
| 单体步骤 | 失败后无法恢复 | 使用带状态的 Continuable 模式 |
输出格式
创建或重构作业时,请提供:
- 作业类 - 完整的作业实现
- 队列策略 - 建议的队列和优先级
- 错误处理 - 重试和故障处理策略
- 测试 - 测试用例示例
- 注意事项 - 并发、幂等性相关说明
评论
支持 Markdown