设置 Sidekiq:Heroku 上的并发

Setting Sidekiq :concurrency on Heroku

我无法弄清楚并发在 Heroku 上的工作原理,以及如何为 Sidekiq

设置最佳 :concurrency

这是设置 -

Puma Web Server
  2 workers
  5 threads

Heroku Dynos
  8 web dynos
  2 "worker" dynos (These will run Sidekiq, not to be confused with Puma Workers)

DB Connections
 120 Max Connections Allowed by Postgres
 5   Active Record Pool Size (default)
 ??  Sidekiq :concurrency value

每个 Puma worker 允许默认的 5 个 ActiveRecord DB 连接(这很好地对应每个有 5 个线程)。由于每个 Web Dyno 有 2 个这样的 Puma worker,每个 Web Dyno 最多消耗 10 个连接。在所有 8 个网络测功机中,它们占用 80 个连接

剩下 120 - 80 = 40 个连接将被 运行 Sidekiq 的 2 个测功机使用。假设每个 dyno 上有一个 Sidekiq 进程 运行ning(这是真的吗?),每个 Sidekiq 进程最多可以免费使用 20 个连接(即设置 :concurrency 20 )

  1. 这个逻辑正确吗,还是我误解了这些过程 运行 在 dynos 上的处理方式?

  2. Sidekiq 进程是否受到 ActiveRecord 连接池限制 5 的任何限制?如果是,听起来将其设置为 20 是没有用的,因为它实际上一次最多只能使用 5 个连接。

感谢您的帮助!

你的逻辑听起来不错,但有几点需要注意。

Puma 不会在所有 5 个线程上持续推送到 Sidekiq,因此您可以使用较低的值,例如所以 5 个线程共享 2 个连接:

Sidekiq.configure_client do |config|
  config.redis = { size: 2 }
end

Sidekiq 并发是工作线程数,而不是连接数。您要明确限制连接池大小:

Sidekiq.configure_server do |config|
  config.redis = { size: 20 }
end

默认情况下,Sidekiq 的连接池大小为(并发数 + 2),但对于默认并发数 25,20 个连接应该可以正常工作。