Sidekiq 7的最新功能和变更
首先
2022年10月,Ruby on Rails(以下简称为Rails)最常用的背景任务Gem之一,Sidekiq的7.0版本(以下简称Sidekiq 7)已经发布。
这个版本增加了许多比以前更大的功能,包括添加到管理界面的指标、嵌入到Puma等进程中、限制每个队列的并发执行数量的封装等。
本文将根据Sidekiq官方网站的文章和GitHub官方项目的内容,对Sidekiq 7的新功能和变化进行解释。
要点
本文中所涉及的版本
本文介绍了在GitHub上公开的Sidekiq OSS版本。如果您使用的是Pro / Enterprise版本,请参考官方网站(英文)。
支持的Rails / Ruby / Redis版本。
支持的版本如下:
-
- Ruby on Rails 6.0以上
-
- Ruby 2.7以上
- Redis 6.2以上
如果你正在使用比上述更旧的版本,则需要提前进行升级。
另外,由于Sidekiq依赖的Gem发生了变化,例如与Redis连接的Gem由redis变为redis-client,redis-namespace被删除等,因此需要进行充分的操作确认。
全新功能
向管理员界面添加指标
工作的执行信息指标已详细显示在Web管理界面中增加了。
以下信息将显示为过去1小时的图表。
-
- Name: ジョブ名(Jobで終わるクラスの名前)
-
- Success: 成功ジョブ数(正常終了したジョブ数)
-
- Failure: 失敗ジョブ数(例外を発生して異常終了したジョブ数)
-
- Total Execution Time: 総実行時間(ジョブの実行時間の合計)
- Average Execution Time: 平均実行時間(1つのジョブあたり実行時間の平均)

虽然Metrics本身是一种简化的工具,不能取代完整功能的APM(Application Performance Monitoring)如DataDog,但它可以让我们通过可视化方式了解一些Sidekiq任务的执行时间等信息。
请查阅以下官方文章以获取有关度量功能的详细信息。
请提供一份参考。
指标 · mperham/sidekiq Wiki
https://github.com/mperham/sidekiq/wiki/Metrics
嵌入到Puma等进程中
直到现在,Sidekiq一直以独立的进程与Web服务器(如Puma)分开运行,但现在可以在Web服务器的进程内运行。
嵌入式的优点在于部署变得简单(只需进行一次设置,然后部署Web服务器,Sidekiq也会运行),以及内存消耗减少(Web服务器一侧加载的Ruby和Rails代码和数据可以在Sidekiq一侧使用)。
以下是关于嵌入式的缺点:Web服务器和Sidekiq合并为一个进程,并且在一个CPU核心上执行一个进程,因此并发执行的线程数量受到限制。
从上述的优点和缺点来看,可以说这个功能适用于小规模系统。
如果您要将Sidekiq嵌入到Puma中,可以按照以下方式进行设置。(不能在config/sidekiq.yml中进行设置。)
# config/puma.rb
workers 2
threads 1, 3
require "sidekiq"
preload_app!
x = nil
on_worker_boot do
x = Sidekiq.configure_embed do |config|
config.queues = %w[default low]
config.concurrency = 2
end
x.run
end
on_worker_shutdown do
x&.stop
end
参考:
嵌入 · mperham/sidekiq Wiki
https://github.com/mperham/sidekiq/wiki/嵌入
胶囊
通过胶囊(capsule)可以定义作业从哪个队列以及同时执行的数量。
在以下的设置示例中,default队列中的作业将以最多同时执行5个,low队列中的作业将以最多同时执行3个的方式来运行。此外,unsafe队列被设置为最多同时执行1个,以便在一个线程中运行不安全的作业。
Sidekiq.configure_server do |config|
# defaultカプセル
config.queues = %w[default]
config.concurrency = 5
# lowカプセル
config.capsule("low") do |cap|
cap.queues = %w[low]
cap.concurrency = 3
end
# unsafeカプセル
config.capsule("unsafe") do |cap|
cap.queues = %w[unsafe]
cap.concurrency = 1
end
end
请引用另一篇例子。
请提供一个选项。
修改点
严格论述中,默认情况下会引发异常。
在Sidekiq 7版本中,对于作业的参数进行了严格的JSON验证,添加了Strict Argument功能,并且如果参数无效,会输出警告。此外,在Sidekiq 7中,这一功能得到了严格化,会抛出异常(ArgumentError)。
您可以使用Sidekiq.strict_args!(false)来禁用此行为,或使用Sidekiq.strict_args!(:warn)将其恢复到原始警告行为。
参考
Implement strict argument checking by kellysutton · Pull Request #5071 · mperham/sidekiq
https://github.com/mperham/sidekiq/pull/5071
服务器设置描述方法的更改
Sidekiq 7对内部API的实现进行了重构,导致以下配置的描述方法发生了变化。
例:记录器的设定
# Sidekiq 6
Sidekiq.logger = ...
# Sidekiq 7
# Sidekiq.loggerは使用できなくなった
Sidekiq.configure_server do |cfg|
cfg.logger = ...
end
连接池的配置
# Sidekiq 6
POOL1 = ConnectionPool.new(size: 5) { Redis.new(ENV['MY_REDIS_URL']) }
Sidekiq.configure_server do |cfg|
cfg.redis = POOL1
end
# Sidekiq 7
# 直接ConnectionPoolのインスタンスを渡せなくなった
Sidekiq.configure_server do |cfg|
cfg.redis = { url: ENV['MY_REDIS_URL'] }
end
请参考
在主分支中,您可以在GitHub上找到mperham/sidekiq的7.0版本的API迁移文档。
迁移至redis-client,删除redis-namespace。
在Sidekiq 7中,我们已经迁移到了使用Redis 6.0以上的RESP3协议的redis-client Gem,而过去我们使用的是redis Gem。在Rails应用中,您仍然可以继续使用redis Gem,但是如果要与Sidekiq.redis建立连接,则会使用redis-client。
此外,不再支持使用redis-namespace Gem来支持Redis的命名空间。推荐使用Redis默认提供的以数字0-15划分的数据库来代替。
请提供更多的上下文,以便我能够为您提供准确的翻译。
Sidekiq/7.0-Upgrade.md文件位于mperham/sidekiq的主要分支中。链接为https://github.com/mperham/sidekiq/blob/main/docs/7.0-Upgrade.md。
此文档主要介绍了从redis-namespace迁移的步骤。有关具体内容,请参考Mike Perham的博客文章“Migrating from redis-namespace”,链接为https://www.mikeperham.com/2017/04/10/migrating-from-redis-namespace/。