Sidekiq,Redis和Postgresql连接池。在我的情况下,我的设置应该是什么样?

问题描述 投票:0回答:1

[相当长的一段时间,在使用sidekiq worker和postgres时,我一直收到connection pool timeout2020-06-17T16:15:33.701Z pid=1132347 tid=goeqpzc8b WARN: PG::ConnectionBad: FATAL: sorry, too many clients already错误。我试图理解这一切是如何工作的,但是无论我将设置如何调整,似乎都无法摆脱这些错误。

现在,我的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工作者都在其中包含了ActiveRecord中CRUD条目的代码,但我不确定实际的sidekiq工作者中有多少重要。

据我所知,我对托管数据库的限制是22个连接顶端,但是我在database.ymlsidekiq.yml文件中的设置低于该限制,因此我不确定它仍然如何或为何仍然失败,而不是只保留在队列中,直到有空间为止。

鉴于这种情况,我应该使用建议的池和并发设置吗? sidekiq辅助程序中的某些命令实际上monitor在特定记录中进行更改以查看其更新时间,因此它会连续检查该记录,并在其中包含预期信息后继续执行。

我正在寻找关于此的任何建议或澄清,以及我应该如何处理。任何帮助将不胜感激。

postgresql activerecord redis sidekiq
1个回答
0
投票

PG :: ConnectionBad:致命:抱歉,已经有太多客户了

20与22之间的差距不会给您带来太大的安全余地。打开pgAdmin4,然后启动一些监视连接,例如(如果绕过连接池)将使您超出限制,如果该池正试图被充分使用。如果您不能增加max_connections,请尝试将池大小减小几倍,以提高安全性。它可能会使另一个问题变得更糟,但是从2个问题变为1个问题是一种进步。

话虽这么说,为什么sidekiq作业失败而不是仅仅排队等待运行?

我不是sidekiq用户,但是显然他们只愿意等待这么长时间,而且已经超出了这个期限。至少,“连接池超时”不是PostgreSQL生成的消息,因此它来自其他地方。并且根据措辞,池管理器显然是候选人。

© www.soinside.com 2019 - 2024. All rights reserved.