当前位置: 首页 > 知识库问答 >
问题:

(Heroku Sidekiq)我对连接池工作原理的理解正确吗?

葛勇锐
2023-03-14

假设我在Heroku Rails上有以下设置,一个web dyno和两个worker dyno。

下面是我相信是真的,我希望有人能证实这些说法或指出一个不正确的假设。

我对这一点很有信心,但我对客户端和服务器的使用感到有点困惑,“连接池”指的是DB和Redis连接,“工作者”指的是puma和heroku dyno工作者。

我想是水晶清楚我希望这也可以作为一个综合指南为任何其他初学者有困难与此

谢谢

>

  • 仅在数据库需要查询以服务页面请求时与数据库交互

工人迪诺

  • 仅当正在运行的Sidekiq作业需要查询数据库时,才与数据库交互
  • 仅与Redis交互以从Sidekiq队列(存储在Redis中)提取作业。这是Sidekiq服务器

>

  • ActiveRecord池大小为25意味着每个dyno有25个连接可供使用。(这是我最不确定的。是每一个迪诺人还是每一个美洲狮/赛德基克人?)

    对于web dynos,它一次只能运行10个线程(2个puma x 5个线程),因此最多只能消耗10个线程。25超出了它的需要。

    对于辅助进程,15的Sidekiq并发意味着一次可以运行15个Sidekiq进程。同样,25个连接超出了它的需要,但这是一个很好的缓冲区,以防有过时或死亡的连接无法清除。

    总的来说,我的Postgres DB可以从web dyno获得10个连接,从每个辅助dyno获得15个连接,总共最多40个连接。

    >

    每个worker dyno(Sidekiq服务器)将使用Sidekiq.configure_server块中指定的连接池size。默认情况下,它是sidekiq并发2,因此这里每个dyno将占用17个redis连接

  • 共有1个答案

    史昊焱
    2023-03-14

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

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

    维护客户端连接池的方法有很多,它可能是JDBC驱动程序本身的一部分,您可能需要使用Apache Commons pooling之类的工具实现池,但无论你做什么,它都会增加你的行为,减少网络故障可能导致的错误,这些故障可能会阻止你的客户端连接到服务器。

    在服务器端,大多数数据库提供程序配置了数据库服务器可能接受的n个可能连接池。通常每个额外的连接都有一个占用空间——通常很小——所以根据可用存储器,您可以计算出可用连接的最大数量。

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

     类似资料:
    • 在Spring boot application.properties文件中,我们有以下选项: 这是我的存储库类 这是服务类 问题是,userRepository如何创建到DB的连接,以及它是否会使用我的应用程序属性文件中的连接池。我来自JDBC和hibernate,在那里我使用DataManager、DataSource、Connection类来使用连接池,但是在spring boot中,我没有

    • 问题内容: 我一直对会话在内部的工作方式感兴趣,但是我对C的知识很少(并且不确定在PHP源代码中的位置)。 这是我目前对会话的了解: 当您启动会话时,将为用户分配一个会话ID,该ID存储在cookie中。 会话数据保存(通过)后,将与相关的会话ID和到期时间一起存储在文件系统中。 它是否正确?另外,创建会话ID的方法是什么?我认为这是基于时间的,但是如果两个用户同时发送请求该怎么办?内部采用什么方

    • 我写了一个类,其中有连接池和流水线,使用这个类的方法类似于(我删除了一个循环,但setKey将发生在循环中): 因此,一旦管道上的项目数超过200,i同步项目并清除管道,然后重新启动。问题是如何使用此设置将连接正确地返回到池。 据我所知,我必须将jedispool.getResource()包装到try块中,但我无法考虑如何将它与管道和计数器结合在一起。

    • 这是在一次采访中问我的。 我回答他说,对于相同的输入集,父母和孩子都应该产生相同的输出集。如果子节点想要扩展父节点的功能,它应该只在父节点支持范围之外的新输入上执行。这样,孩子将维持其父母签订的合同。 我给他举了一个例子,一个api可能正在使用这样的父级 如果这个孩子在这里产生了不同的输出,那么这个孩子就违反了它的父母签订的合同。 他对我的回答不满意,并告诉我这是简单的压倒一切,不违反LSP。所以

    • 我正在阅读Kafka的文件,并试图理解它的工作。这是关于消费者的。简而言之,一个主题被划分成若干个分区。有多个消费者组,每个消费者组有多个消费者实例。现在,我的问题是,是否每个分区发送“相同”的消息给每个消费者组,这些消息又被赋予组内的特定消费者实例? 如果我错过了什么,请给我指引。

    • 本文向大家介绍SELINUX工作原理详解,包括了SELINUX工作原理详解的使用技巧和注意事项,需要的朋友参考一下 1. 简介 SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。     Security-Enhanced Linux (SELinux)由以下两部分组成:     1) Kernel SELinux模块(/kernel/security/selinux