[相当长的一段时间,在使用sidekiq worker和postgres时,我一直收到connection pool timeout
和2020-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.yml
和sidekiq.yml
文件中的设置低于该限制,因此我不确定它仍然如何或为何仍然失败,而不是只保留在队列中,直到有空间为止。
鉴于这种情况,我应该使用建议的池和并发设置吗? sidekiq辅助程序中的某些命令实际上monitor在特定记录中进行更改以查看其更新时间,因此它会连续检查该记录,并在其中包含预期信息后继续执行。
我正在寻找关于此的任何建议或澄清,以及我应该如何处理。任何帮助将不胜感激。
PG :: ConnectionBad:致命:抱歉,已经有太多客户了
20与22之间的差距不会给您带来太大的安全余地。打开pgAdmin4,然后启动一些监视连接,例如(如果绕过连接池)将使您超出限制,如果该池正试图被充分使用。如果您不能增加max_connections,请尝试将池大小减小几倍,以提高安全性。它可能会使另一个问题变得更糟,但是从2个问题变为1个问题是一种进步。
话虽这么说,为什么sidekiq作业失败而不是仅仅排队等待运行?
我不是sidekiq用户,但是显然他们只愿意等待这么长时间,而且已经超出了这个期限。至少,“连接池超时”不是PostgreSQL生成的消息,因此它来自其他地方。并且根据措辞,池管理器显然是候选人。