mcpField
A
active-job-coder

active-job-coder

github.com/majesticlabs-dev开发5067 次安装7 周前更新
代码仓库

关于 active-job-coder

为 Ruby on Rails 编码 Agent 提供 Active Job 的设计与重构指导,重点包括队列策略、重试、并发控制、定时执行和幂等性。

主要功能

  1. 01按单一职责设计 Job
  2. 02传递 ID 并获取最新对象
  3. 03设置队列与优先级
  4. 04配置重试、丢弃和错误处理
  5. 05控制并发并安排延迟任务

适用场景

  1. 01创建邮件发送或订单处理任务
  2. 02为外部 API 调用设置重试策略
  3. 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 模式

输出格式

创建或重构作业时,请提供:

  1. 作业类 - 完整的作业实现
  2. 队列策略 - 建议的队列和优先级
  3. 错误处理 - 重试和故障处理策略
  4. 测试 - 测试用例示例
  5. 注意事项 - 并发、幂等性相关说明

评论

支持 Markdown