(Heroku + Sidekiq)我了解连接池如何工作正确吗?

问题描述:

假设我在Heroku + Rails上使用了下面的设置,使用一个网络测试仪和两个工人测试仪。(Heroku + Sidekiq)我了解连接池如何工作正确吗?

以下是我认为是真实的,我希望有人可以确认这些陈述或指出一个不正确的假设。

我对这个大部分都很有信心,但是我对客户端和服务器的使用,指向DB和Redis连接的“连接池”以及指的是puma和“worker” heroku dyno工人。

我想一清二楚,我希望这也可以作为有这个

感谢麻烦任何其他初学者综合指南!

enter image description here

一切如何相互作用

  • 的Web测功机(在Rails应用程序运行)

    • 只能用DB时,需要查询其服务的网页交互请求
    • 只有在将作业推送到Sidekiq队列(存储在Redis中)时才与Redis交互。这是Sidekiq 客户
  • 工人赛道

    • 如果Sidekiq工作,它的运行需要查询数据库仅与数据库进行交互
    • 只有Redis的交互拉工作从Sidekiq队列(存储在Redis中)。这是Sidekiq 服务器

ActiveRecord的池大小

  • 25一个ActiveRecord池大小意味着每个赛道有25个连接的工作。 (这是我最不确定的。它是每个赛道或每个彪马/ Sidekiq工人?

  • 对于Web DYNOS,它只能一次(2美洲狮跑的10件事(线程)X 5个线程),所以它只会消耗最多10个线程。 25超出了它的需求。

  • 对于工作者动态,15的Sidekiq并发意味着15个Sidekiq进程可以一次运行。同样,25个连接超出了它所需要的范围,但是如果存在无法清除的过时或死亡连接,这将是一个很好的缓冲区。

  • 总的来说,我的Postgres DB可以预计来自Web dyno的10个连接和来自每个工人dyno的15个连接,总共最多连接40个连接。

Redis的池大小

  • 该网站DYNO(Sidekiq客户端)将利用其在Sidekiq.configure_client块中指定的连接池size。一般来说〜3是足够的,因为客户端不会不断地向队列中添加作业。 (它是3元测功机,或3%彪马工人?

  • 每个工人DYNO(Sidekiq服务器)将利用其在Sidekiq.configure_server块中指定的连接池size。默认情况下,它的sidekiq并发+ 2,所以这里17个Redis的连接将通过每个赛道

+0

从帖子中消除“worker”一词。使用“线程”,“过程”和“动态”。 15的并发意味着1个Sidekiq进程有15个线程。 –

+1

连接池大小是每个进程。测功机可以运行多个进程。 –

我不知道的Heroku的Rails +,但相信我可以回答一些更一般的问题进行讨论。

从客户的角度来看,任何连接的设置/拆卸都非常昂贵。连接池的概念是有一组连接保持活动状态并可以使用一段时间。 JDK HttpUrlConnection执行相同的操作(假设HTTP 1.1),因此 - 假设您要访问同一个服务器 - HTTP连接保持打开状态,等待下一个预期的请求。这里同样适用 - 不是每次都关闭JDBC连接,而是保持连接 - 假设服务器和认证凭证相同 - 所以下一个请求跳过了不必要的工作,可以立即向数据库服务器发送工作。

维护客户端连接池有许多方法,它可能是JDBC驱动程序本身的一部分,您可能需要使用Apache Commons Pooling之类的方法来实现池,但无论您做什么,它都会增加您的行为并减少可能由网络打嗝造成的错误,这些错误可能会阻止您的客户端连接到服务器。

服务器端,大多数数据库提供程序都配置有数据库服务器可能接受的n个可能连接池。通常每个附加连接都有一个占位面积 - 通常很小 - 所以根据可用内存,可以计算出可用连接的最大数量。

在大多数情况下,您将希望获得大于预期的连接。例如,在postgres中,配置的连接池大小适用于该服务器上任何数据库的所有连接。如果开发,测试和生产都指向同一个数据库服务器(显然是不同的数据库),则测试使用的连接可能会阻止生产请求得到满足。最好不要小气。

+0

感谢您的背景!通过提供一些很好的见解,特别是从另一种语言。虽然问题的核心是关于Rails + Heroku + Sidekiq的设置,但我必须等待更具体的答案才能接受。欣赏它:) – user2490003