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

Nie*_*ian 6 postgresql connection-pooling pgbouncer sidekiq apartment-gem

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

选项1我一直在考虑在数据库前添加pgBouncer,但我目前无法使用它的事务模式,因为我高度依赖于search_path在每个作业处理的开头设置以确定哪个"国家"(PostgreSQL模式)工作(公寓宝石).在这种情况下,我将不得不使用基于会话的连接池模式.然而,据我所知,这会要求我在每次作业处理后断开连接,将连接释放回池中,这样做性能真的很高,不是吗?我错过了什么吗?

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

选项3我没有想到的东西?

Har*_*rry 4

选项 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 或基于应用程序的连接池。连接池实际上会以某种方式限制或限制您的应用程序,以节省数据库。