带有 Sidekiq 适配器的 ActiveJob 是否对纯 Sidekiq worker 有性能问题?

Does ActiveJob with Sidekiq adapter have performance issue against pure Sidekiq worker?

我在 Sidekiq 官方 wiki 中看到 this ActiveJob 会慢得多。

但它是在2018年3月提到的,基于Rails 4.2和Sidekiq 5.1.1,根据这个issue,最新的是Rails 6和Sidekiq 6。

在这种情况下,纯 Sidekiq worker 比带 Sidekiq 适配器的 ActiveJob 更受推荐吗?

ActiveJob 是 Sidekiq::Worker 之上的适配器层,它总是会增加开销。也就是说,版本、应用程序和 usecase-specific 有多少开销,因此只有您可以测量自己的系统来确定您看到的开销类型。

Benchmarks show that Active Job is 2-20x times slower pushing jobs to Redis and has ~3x the processing overhead (with Rails 5.1.4 and Sidekiq 5.1.1).

https://github.com/mperham/sidekiq/wiki/Active-Job#performance

我准备了一个简单的基准测试:https://github.com/mpan-wework/sidekiq-benchmark/actions?query=workflow%3ARSpec

CreateUserJob
  behaves like Benchmark Job
"CreateUserJob-0, 1601366451612"
"CreateUserJob-last, 500, 1601366532766"
    runs for 501 times

PureJob
  behaves like Benchmark Job
"PureJob-0, 1601366532791"
"PureJob-last, 500, 1601366542691"
    runs for 501 times

CreateUserWorker
  behaves like Benchmark Worker
"CreateUserWorker-0, 1601366542695"
"CreateUserWorker-last, 500, 1601366621057"
    runs for 501 times

PureWorker
  behaves like Benchmark Worker
"PureWorker-0, 1601366621072"
"PureWorker-last, 500, 1601366630103"
    runs for 501 times

Finished in 2 minutes 58.5 seconds (files took 1.72 seconds to load)
4 examples, 0 failures

基准测试结果是 运行 优于 github 操作,其中一个 postgres 容器作为数据库,一个 redis 容器作为缓存。

Pure job or worker 仅包含 in-memory 命令,CreateUser job or worker 将通过 SQL.

创建 100 个用户

0表示第一个job/worker到运行的时间戳;当每个job/worker结束时,它会将其id和结束时间写入缓存,因此last代表最后一个job/worker。

对于每种类型的 job/worker,有 501 个项目入队。

根据收集的数据,PureJob 需要 9.900 秒,而 PureWorker 需要 9.031 秒; CreateUserJob 需要 81.154 秒,而 CreateUserWorker 需要 78.362 秒。 Sidekiq worker 比使用 Sidekiq 适配器的 ActiveJob 更快,但不如说明的那么快。

我还没有在具有多个 rails 和 sidekiq pods 的 kubernetes 集群上进行测试,但我想差异不会很大。