假设我在Heroku + Rails上有以下设置,有一个网络dyno和两个工作人员dynos。
以下是我认为是真实的,我希望有人能够证实这些陈述或指出不正确的假设。
我对此大部分都很有信心,但我对客户端和服务器的使用感到困惑,“连接池”指的是DB和Redis连接,而“worker”指的是puma和heroku dyno工作人员。
我想说清楚,我希望这也可以作为任何其他初学者的综合指南
谢谢!
Web dyno(运行Rails应用程序的地方)
工人dyno
ActiveRecord池大小为25表示 每个dyno 有25个连接可供使用。 (这是我最不确定的。是每个dyno还是每个Puma / Sidekiq工人?)
对于web dynos,它一次只能运行10个东西(线程)(2个puma x 5个线程),所以它最多只能消耗10个线程。 25超出了它的需要。
对于工作人员dynos,Sidekiq并发度为15意味着可以同时运行15个Sidekiq进程。同样,25个连接超出了它的需要,但它是一个很好的缓冲区,以防有陈旧或死连接无法清除。
总的来说,我的Postgres DB可以预期来自web dyno的10个连接和来自每个worker dyno的15个连接,总共最多40个连接。
Web dyno(Sidekiq客户端)将使用size
块中指定的连接池Sidekiq.configure_client
。通常~3就足够了,因为客户端不会不断地向队列中添加作业。 (每个dyno是3,还是每个Puma工作3个?)
每个工作人员dyno(Sidekiq服务器)将使用size
块中指定的连接池Sidekiq.configure_server
。默认情况下,它是sidekiq并发+ 2,因此每个dyno将占用17个redis连接
答案 0 :(得分:2)
我不了解Heroku + Rails,但相信我可以回答一些更通用的问题。
从客户端的角度来看,任何连接的设置/拆除都非常昂贵。连接池的概念是具有一组保持活动并且可以使用一段时间的连接。 JDK HttpUrlConnection执行相同的操作(假设HTTP 1.1),以便 - 假设您要访问同一服务器 - HTTP连接保持打开状态,等待下一个预期请求。同样适用于此 - 不是每次都关闭JDBC连接,而是保持连接 - 假设相同的服务器和身份验证凭据 - 因此下一个请求会跳过不必要的工作,并且可以立即继续向数据库服务器发送工作。
有许多方法可以维护客户端连接池,它可能是JDBC驱动程序本身的一部分,您可能需要使用Apache Commons Pooling之类的东西来实现池化,但无论你做什么,它都会去增加您的行为并减少可能导致客户端无法连接到服务器的网络打嗝可能导致的错误。
服务器端,大多数数据库提供程序都配置了数据库服务器可以接受的n个可能连接池。通常每个附加连接都有一个足迹 - 通常很小 - 因此根据可用内存,您可以计算出最大可用连接数。
在大多数情况下,您可能希望获得大于预期的连接。例如,在postgres中,配置的连接池大小适用于该服务器上任何数据库的所有连接。如果您的开发,测试和生产都指向同一个数据库服务器(显然是不同的数据库),那么测试使用的连接可能会阻止生成请求的实现。最好不要小气。