gpt4 book ai didi

ruby-on-rails - 确保 Rails 和 Sidekiq 不超过最大数据库连接数

转载 作者:行者123 更新时间:2023-12-05 01:45:54 25 4
gpt4 key购买 nike

我在单线程 Rails 应用程序中使用 Nginx 和 Phusion Passenger。这是问题所在。在该应用程序中,我使用多线程 sidekiq 来执行一些后台作业。通常在我的 database.yml 中,我只需要将池值设置为 1。这是一个示例:

default: &default
adapter: mysql2
encoding: utf8
collation: utf8_unicode_ci
pool: 1
username: username
password: password
host: localhost

原因是因为对于每个打开的tcp套接字连接,当一个http请求通过那个套接字进来时,nginx会接受请求并将信息传递给passenger。 Passenger 检测到它是一个 Rails 应用程序,它生成一个 Rails 实例,它将响应转换为 html,发送回 nginx,然后传回客户端(浏览器)所以对于每个 passenger 实例,我只需要一个数据库连接,使用单线程 Rails 应用程序。

但是在我的 sidekiq.yml 中,我将并发设置为 5:

:concurrency: 5 

这意味着对于每个乘客架实例,我将有 5 个由 sidekiq 处理的并发线程加上主应用程序的一个连接,即一个乘客实例总共有 6 个数据库连接。

当我查看 passenger-status 时,我注意到 max_pool_size 设置为 6:

----------- General information -----------
Max pool size : 6

那么这是否意味着 passenger 永远不会同时产生超过 6 个 Rails 实例?如果是这样,这是否意味着我的数学是正确的:6(实例)* 6(数据库连接:5 个用于 sidekiq,1 个用于主应用程序)= 36(我的 Rails 应用程序可以同时处理的数据库连接总数).

现在我的 mysql 数据库配置为处理 151 个最大并发连接。

SHOW VARIABLES LIKE "max_connections";
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+

我只是想确保我对 passenger、rails 和 sidekiq 的计算是正确的。

最佳答案

首先,您的 Sidekiq 进程和您的 Web 服务器(在您的例子中是 Passenger)是分开的。 Passenger 的线程池大小对你的 Sidekiq 并发没有影响;相反,您的 Sidekiq 配置指定了一个单独的并发。因此,我们将分别考虑这两者:

乘客

ActiveRecord 数据库池值是您的 Web 进程将使用的数据库连接数,所有线程的总数。如果您的 Passenger 服务器设置为多进程模式,那么您的 Web 进程的最大连接数是 db pool size * passenger pool size。另一方面,如果您将其设置为多线程模式(如果可能的话我会推荐),您的最大连接数只是 db pool size(乘以正在运行的进程数量;Puma ,例如,默认情况下运行两个进程,最多 15 个线程,因此在这种情况下最大连接数为 30)。

因此,如果您使用的是多线程模式,1 的池大小绝对不够——您至少需要一个与您期望的线程一样大的池。在多进程模式下,1 可能 可以工作,但我怀疑它是否真的值得偏离默认值 5,直到您遇到问题。

侧记

Sidekiq 始终以多线程模式运行(从技术上讲,您也可以运行多个进程,但我假设您不是)。因此,像上面一样,您希望连接池至少与线程数一样大。这可能意味着您的数据库池值在技术上需要两个不同的值,具体取决于 Rails 环境是为 Passenger 还是为 Sidekiq 旋转——参见 this issue on the Sidekiq repothis helpful Heroku guide有关如何解决该问题的更多信息。

总结

请记住,除了上述所有内容之外,您可能很容易让多台服务器都运行相同的 Rails 应用程序,但只有一个数据库具有一个连接限制。如果您在最多 6 个进程的多实例模式下运行 Passenger,请将您的数据库池大小设置为 5,然后每个 Web 服务器节点将使用最多 30 个连接。如果它运行的是 Sidekiq 服务器,则向其添加 5。您可能不需要超过一个 Sidekiq 服务器,因此 4 个 Web 节点 @ 30 个连接 + 一个 Sidekiq 进程 @ 5 个连接 = 125 个最大连接,完全在您的 MySQL 连接限制内。

关于ruby-on-rails - 确保 Rails 和 Sidekiq 不超过最大数据库连接数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39416709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com