activerecord—sidekiq、redis和postgresql连接池根据我的场景,我的设置应该是什么样的?

5ktev3wc  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(412)

很长一段时间以来,我一直收到 connection pool timeout 以及 2020-06-17T16:15:33.701Z pid=1132347 tid=goeqpzc8b WARN: PG::ConnectionBad: FATAL: sorry, too many clients already 使用sidekiq workers和postgres时出错。我试着理解这一切是如何简单地工作的,但无论我如何调整设置,似乎都无法摆脱这些错误。
现在,我的朋友 config/database.yml 文件使用这些设置作为其选项:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 20
  port: 25060

在我的 config/sidekiq.yml 文件,我还设置了以下选项:

development:
  :concurrency: 20
production:
  :concurrency: 20
:queues:
  - default

根据我在digital ocean的数据库设置,我的后端服务器连接限制为22。
既然如此,为什么sidekiq作业会失败,而不是排队等待运行呢?我的每一个sidekiq工作人员都有代码来crud activerecord中的条目,但我不确定这在实际的sidekiq工作人员中有多重要。
据我所知,我对托管数据库的限制是最多22个连接,但我在 database.yml 以及 sidekiq.yml 文件低于限制,所以我不确定它是如何或为什么仍然失败的,而不是仅仅停留在队列中直到有空间为止。
在这种情况下,我是否应该使用建议的池和并发设置?sidekiq workers中的一些命令实际上监视特定记录中的更改,以查看它何时被更新,因此它会不断检查记录,然后在预期的信息出现在记录中后继续执行。
我正在寻找任何建议或澄清这一点。

lyfkaqu1

lyfkaqu11#

pg::connectionbad:fatal:抱歉,已经有太多客户端了
20和22之间的差距不会给你多少安全边际。例如,打开pgadmin4,然后启动一些监控连接(都绕过了连接池),如果池正试图被完全使用,则会超出限制。如果不能增加max\u连接,请尝试将池大小减少两个,以提高安全性。这可能会使另一个问题变得更糟,但从2个问题变成1个问题是一种进步。
既然如此,为什么sidekiq作业会失败,而不是排队等待运行呢?
我不是sidekiq的用户,但显然他们只愿意等这么长时间,而且这段时间已经超过了。或者至少,“连接池超时”不是由postgresql生成的消息,所以它来自其他地方;从措辞上看,游泳池经理显然是候选人。

相关问题