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つのジョブあたり実行時間の平均)
スクリーンショット 2023-03-07 18.52.36.png

虽然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/。

bannerAds