如何从sidekiq管理到PostgreSQL的连接池?

时间:2016-03-19 00:49:07

标签: postgresql connection-pooling sidekiq pgbouncer apartment-gem

问题我有一个运行几百个sidekiq后台进程的rails应用程序。它们都连接到一个PostgreSQL数据库,它对提供250个连接并不十分满意 - 它可以,但如果所有sidekiq进程意外地向db发送查询,它就会崩溃。

选项1 我一直在考虑在数据库前添加pgBouncer,但我目前无法使用它的事务模式,因为我高度依赖于设置{ {1}}在每个职位处理开始时确定哪个"国家" (PostgreSQL架构)工作(apartment-gem)。在这种情况下,我将不得不使用基于会话的连接池模式。然而,据我所知,这会要求我在每次作业处理后断开连接,将连接释放回池中,这样做的代价真的很高,不是吗?我错过了什么吗?

选项2 使用基于应用程序层的连接池也是一个选项,但是我不确定如何使用sidekiq为PostgreSQL做到这一点?

选项3 我没有想过的事情?

2 个答案:

答案 0 :(得分:3)

选项1:您是正确的,会话将要求您删除并重新连接,这会增加开销。取决于访问模式的成本是多少,即连接/ tcp握手等的部分是完成的工作总量以及您需要的延迟类型。绝对值得基准,但如果连接是短暂的,那么开销将非常明显。

选项2/3:您可以对sidekiq作业进行限制或限制。这里有一些项目可以解决这个问题......

队列限制

  • Sidekiq Limit Fetch:限制能够同时运行指定队列的工作线程数。您可以暂停队列并动态调整队列分配大小。还跟踪每个队列的活动工作者数量。支持全局模式(多个sidekiq进程)。还有一个额外的阻塞队列模式。
  • Sidekiq Throttler:Sidekiq :: Throttler是Sidekiq的中间件,它增加了对每个工作人员执行速率限制的能力。
  • sidekiq-rate-limiter:Redis支持,每个工作人员的工作处理速率限制。
  • Sidekiq::Throttled:并发和阈值限制。

我从这里得到了上述内容

https://github.com/mperham/sidekiq/wiki/Related-Projects

如果您的应用程序必须具有每个进程的连接,并且您无法在更多线程可以使用连接的情况下将其分解,那么它是pgBouncer或基于应用程序的连接池。实际上,连接池可能会以某种方式限制或限制您的应用程序以保存数据库。

答案 1 :(得分:-1)

Sidekiq应该只为每个工作线程需要一个连接。如果您将concurrency设置为合理的值,例如10-25,我认为您不应该使用250个并发数据库连接。您运行了多少个工作进程,它们的并发性是什么?

此外,您可以在该页面上看到即使您具有高并发设置,您仍然可以创建该进程中的线程共享的连接池。