小编Hei*_*ezi的帖子

Sidekiq并发和数据库连接池

这是我的问题:每天晚上,我必须处理大约50k的后台作业,每个作业平均需要60s。这些工作基本上是在调用Facebook,Instagram和Twitter API,以收集用户的帖子并将其保存在我的数据库中。作业由sidekiq处理。

首先,我的设置是:

  • :concurrency: 5sidekiq.yml

  • pool: 5 在我的 database.yml

  • RAILS_MAX_THREADS在我的Web服务器(puma)配置中设置为5 。

我的理解是:

  • 我的网络服务器(rails s)将最多使用5个线程,因此最多可与数据库建立5个连接,因为连接池设置为5,所以可以。

  • 我的sidekiq进程将使用5个线程(因为并发设置为5),也可以,因为连接池设置为5。

为了同时处理更多作业并减少处理所有作业的全局时间,我决定将sidekiq并发性提高到25。在生产中,我预配置了最大连接数为120的Heroku Postgres标准数据库。确保我将能够使用Sidekiq并发。

因此,现在的设置是:

  • :concurrency: 25sidekiq.yml

  • pool: 25 在我的 database.yml

  • RAILS_MAX_THREADS在我的Web服务器(puma)配置中设置为5 。

我可以看到有25个sidekiq工人正在工作,但每个Job正在占用更多时间(有时是40分钟而不是1分钟)!

实际上,我一直在进行一些测试,并意识到以50、10或25的sidekiq并发处理50个Job会得到相同的持续时间。好像某个地方存在5个连接的瓶颈。

我已经检查了Sidekiq文档以及关于SO的其他一些文章(sidekiq-并发> 50是否稳定?扩展sidekiq网络体系结构:并发与进程),但是我无法解决我的问题。

所以我想知道:

  • 我对Rails database.yml连接pool和sidekiq的理解concurrency正确吗?

  • 设置这些参数的正确方法是什么?

postgresql activerecord ruby-on-rails heroku sidekiq

5
推荐指数
1
解决办法
2412
查看次数