Sidekiq Unique Jobs 使用教程
1. 项目介绍
sidekiq-unique-jobs
是一个用于 Sidekiq 的 Ruby gem,旨在防止 Sidekiq 作业的重复执行。通过在 Redis 中创建一组基于队列、类和参数的键,该 gem 确保在给定的作业哈希中只能获取一个锁。当无法获取锁时,可以通过选择的冲突策略来处理。
2. 项目快速启动
安装
首先,将以下行添加到你的应用程序的 Gemfile
中:
gem 'sidekiq-unique-jobs'
然后执行:
bundle
配置中间件
在 config/initializers/sidekiq.rb
文件中配置中间件:
require "sidekiq-unique-jobs"
Sidekiq.configure_server do |config|
config.redis = { url: ENV["REDIS_URL"], driver: :hiredis }
config.client_middleware do |chain|
chain.add SidekiqUniqueJobs::Middleware::Client
end
config.server_middleware do |chain|
chain.add SidekiqUniqueJobs::Middleware::Server
end
SidekiqUniqueJobs::Server.configure(config)
end
Sidekiq.configure_client do |config|
config.redis = { url: ENV["REDIS_URL"], driver: :hiredis }
config.client_middleware do |chain|
chain.add SidekiqUniqueJobs::Middleware::Client
end
end
创建你的第一个 Worker
使用 :until_executed
锁类型创建一个 Worker:
# frozen_string_literal: true
class UntilExecutedWorker
include Sidekiq::Worker
sidekiq_options lock: :until_executed
def perform
logger.info("cowboy")
sleep(1) # 模拟复杂处理
logger.info("beebop")
end
end
3. 应用案例和最佳实践
防止重复作业
在某些场景下,你可能希望防止同一作业在短时间内多次执行。例如,对于一个需要定期执行的任务,你可以使用 :until_executed
锁来确保每次任务只执行一次。
class DailyTaskWorker
include Sidekiq::Worker
sidekiq_options lock: :until_executed
def perform
# 每日任务逻辑
end
end
处理长时间运行的作业
对于需要长时间运行的作业,可以使用 :until_expired
锁来确保作业在一定时间内不会重复执行。
class LongRunningTaskWorker
include Sidekiq::Worker
sidekiq_options lock: :until_expired, lock_ttl: 1.day
def perform
# 长时间运行任务逻辑
end
end
4. 典型生态项目
Sidekiq
sidekiq-unique-jobs
是 Sidekiq 的一个扩展,Sidekiq 是一个用于 Ruby 的后台作业处理系统。Sidekiq 使用 Redis 来存储作业队列,并提供了强大的并发处理能力。
Redis
Redis 是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。sidekiq-unique-jobs
依赖 Redis 来存储和管理作业的唯一性锁。
Ruby
Ruby 是一种动态、开源的编程语言,以其简洁性和生产力而闻名。sidekiq-unique-jobs
是一个 Ruby gem,适用于任何使用 Ruby 和 Sidekiq 的项目。
通过以上步骤,你可以快速上手并使用 sidekiq-unique-jobs
来防止 Sidekiq 作业的重复执行,提高系统的稳定性和可靠性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考