这是我的问题:每晚我需要处理约50k个后台作业,每个作业平均需要60秒。这些作业基本上是调用 Facebook、Instagram 和 Twitter 的 API 来收集用户的帖子并将它们保存在我的数据库中。这些作业由 Sidekiq 处理。
起初,我的设置是:
- 在 `sidekiq.yml` 中设置了 `:concurrency: 5` - 在我的 `database.yml` 中设置了 `pool: 5` - 在我的 Web 服务器(`puma`)配置中将 `RAILS_MAX_THREADS` 设置为 5
我的理解是:
- 我的 Web 服务器 (`rails s`) 将使用最多 5 个线程,因此最多只会有 5 个连接到我的数据库,这对于连接池设置为 5 是可以接受的。 - 我的 Sidekiq 进程将使用 5 个线程(因为并发设置为 5),这也是可以接受的,因为连接池设置为 5。
为了在同一时间内处理更多的作业并减少处理所有作业的全局时间,我决定将 sidekiq 并发性增加到 25。在生产环境中,我提供了一个 Heroku Postgres Standard 数据库,并设置了最大连接数为 120,以确保能够使用 Sidekiq 并发性。
因此,现在的设置是:
- 在 `sidekiq.yml` 中设置了 `:concurrency: 25` - 在我的 `database.yml` 中设置了 `pool: 25` - 在我的 Web 服务器(`puma`)配置中将 `RAILS_MAX_THREADS` 设置为 5。
起初,我的设置是:
- 在 `sidekiq.yml` 中设置了 `:concurrency: 5` - 在我的 `database.yml` 中设置了 `pool: 5` - 在我的 Web 服务器(`puma`)配置中将 `RAILS_MAX_THREADS` 设置为 5
我的理解是:
- 我的 Web 服务器 (`rails s`) 将使用最多 5 个线程,因此最多只会有 5 个连接到我的数据库,这对于连接池设置为 5 是可以接受的。 - 我的 Sidekiq 进程将使用 5 个线程(因为并发设置为 5),这也是可以接受的,因为连接池设置为 5。
为了在同一时间内处理更多的作业并减少处理所有作业的全局时间,我决定将 sidekiq 并发性增加到 25。在生产环境中,我提供了一个 Heroku Postgres Standard 数据库,并设置了最大连接数为 120,以确保能够使用 Sidekiq 并发性。
因此,现在的设置是:
- 在 `sidekiq.yml` 中设置了 `:concurrency: 25` - 在我的 `database.yml` 中设置了 `pool: 25` - 在我的 Web 服务器(`puma`)配置中将 `RAILS_MAX_THREADS` 设置为 5。
我发现有25个 Sidekiq 工作进程在工作,但每个作业所需的时间都比较长(有时需要40分钟,而不是1分钟)!
实际上,我进行了一些测试并发现使用 Sidekiq 并发数为5、10或25时,在相同的时间内处理50个作业的结果是一样的。好像某个地方出现了5个连接的瓶颈。
我已经查看了Sidekiq文档和一些SO文章(sidekiq-是否稳定支持并发数 > 50?, Scaling sidekiq 网络架构:并发 vs 进程),但我无法解决我的问题。
所以我想知道:
我的 Rails 的
database.yml
连接池和 Sidekiq 的concurrency
是否理解正确?如何正确设置这些参数?