设置Sidekiq:Heroku上的并发

use*_*003 4 concurrency multithreading ruby-on-rails heroku sidekiq

我无法弄清楚Heroku上的并发性是如何工作的,以及如何:concurrency为Sidekiq 设置最佳值

这是设置 -

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
Run Code Online (Sandbox Code Playgroud)

每个Puma工作者都可以使用默认的5个ActiveRecord DB连接(这对于每个有5个线程的连接很好).由于每个Web Dyno中有2个这样的Puma工作者,因此每个Web Dyno最多可以消耗10个连接.在所有8个Web dynos中,它们占用了80个连接

这将留下120 - 80 = 40个连接将被运行Sidekiq的2个dynos使用.假设每个dyno上都运行一个Sidekiq进程(这是真的吗?),每个Sidekiq进程最多可以使用20个连接(即设置:concurrency 20)

  1. 那个逻辑是正确的,还是我误解了这些过程如何在dynos上运行?

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

谢谢您的帮助!

Mik*_*ham 10

你的逻辑听起来不错,但有几个注意事项.

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

Sidekiq.configure_client do |config|
  config.redis = { size: 2 }
end
Run Code Online (Sandbox Code Playgroud)

Sidekiq并发是工作线程的数量,而不是连接.您希望显式限制连接池大小:

Sidekiq.configure_server do |config|
  config.redis = { size: 20 }
end
Run Code Online (Sandbox Code Playgroud)

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