ActiveJob Status 使用教程
项目介绍
ActiveJob Status 是一个为 ActiveJob 提供简单任务状态信息的 gem。这个 gem 利用 ActiveJob 的回调机制,通过设置简单的 ActiveSupport::Cache 值来跟踪任务状态和任务批次。为了防止内存占用过多,任务和批次跟踪信息默认在 72 小时后过期。目前,可以设置批次信息过期时间,但不能设置任务信息过期时间。
项目快速启动
安装
首先,将以下代码添加到你的应用的 Gemfile 中:
gem 'active_job_status'
然后执行:
bundle install
或者手动安装:
gem install active_job_status
配置
你需要告诉 ActiveJobStatus 关于你的内存存储。默认情况下,告诉 ActiveJobStatus 使用 Rails 内置的内存存储:
# config/initializers/active_job_status.rb
ActiveJobStatus.store = ActiveSupport::Cache::MemoryStore.new
如果你使用 Resque、Sidekiq 或者已经在你的技术栈中使用了 Redis,建议告诉 ActiveJobStatus 使用 Redis 来存储任务元数据。为此,你需要先配置 ActiveSupport::Cache 使用 Redis 作为其存储(可能通过使用这个 gem),然后使用以下初始化器:
# config/initializers/active_job_status.rb
ActiveJobStatus.store = ActiveSupport::Cache::RedisStore.new
使用
让你的任务继承自 ActiveJobStatus::TrackableJob
而不是 ActiveJob::Base
:
class MyJob < ActiveJobStatus::TrackableJob
# 你的任务代码
end
或者,如果你使用版本 1.2 或更高版本,可以只包含 ActiveJobStatus::Hooks
:
class MyJob < ActiveJob::Base
include ActiveJobStatus::Hooks
# 你的任务代码
end
应用案例和最佳实践
任务状态检查
你可以使用任务的 job_id
来检查任务的状态。任务状态仅在任务排队后 72 小时内可用:
my_job = MyJob.perform_later
job_status = ActiveJobStatus.fetch(my_job.job_id)
puts job_status.status # => :queued, :working, :completed, nil
任务批次
对于任务批次,你可以使用任何你想要的键(例如,你可能使用数据库中的主键或 UUID)。如果另一个批次使用相同的键,它的任务将被添加到现有批次中:
batch_id = "230923asdlkj230923"
batch = ActiveJobStatus::JobBatch.new(batch_id: batch_id)
batch.add(job_id: "b67af7a0-3ed2-4661-a2d5-ff6b6a254886")
batch.add(job_id: "6c0216b9-ea0c-4ee9-a3b2-501faa919a66")
你可以搜索批次:
batch = ActiveJobStatus::JobBatch.find(batch_id: batch_id)
puts batch.job_ids # => ["b67af7a0-3ed2-4661-a2d5-ff6b6a254886", "6c0216b9-ea0c-4ee9-a3b2-501faa919a66"]
典型生态项目
ActiveJob Status 可以与以下项目结合使用,以提供更强大的后台任务处理能力:
- Resque: 一个基于 Redis 的后台任务处理系统。
- Sidekiq: 另一个流行的基于 Redis 的后台任务处理系统,提供更高级的功能和更好的性能。
- Redis: 一个开源的内存数据结构存储,用作数据库、缓存和消息代理。
通过结合这些项目,你可以构建一个高效、可扩展的后台任务处理系统。