gpt4 book ai didi

mysql - Sidekiq 在 AWS RDS 上返回 "ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)"

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:21 30 4
gpt4 key购买 nike

我正在使用 Sidekiq 在 AWS 服务器上创建 PDF 文档以在后台处理此作业。

在创建 PDF 文件的过程中,[Rails] 应用程序正在汇集数据库以检查是否创建了 PDF 文件(间隔:2 秒)。

今天早上我在 Sidekiq 端收到此错误消息:

ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)

我正在使用带有 MySQL 的 Amazon RDS。

作为临时解决方案,我将database.yml中的pool参数从10增加到30,但是我意识到这只是一个临时补丁。

如何正确修复?

谢谢

最佳答案

我认为您的解决方案实际上是正确的。 ActiveRecord::ConnectionPool 是基于线程的,即它试图为每个想要使用数据库的线程获取一个单独的连接。如果有更多线程想要访问数据库,则连接池的总大小(使用 pool 中的 database.yml 选项配置),ConnectionPool如果来自其他线程的连接被释放,默认情况下会尝试等待最多 5 秒。在这 5 秒超时后,ActiveRecord::ConnectionTimeoutError引发异常。

现在,Sidekiq 使用 25 worker threads by default 。因此,在更高的负载下,完全有可能同时有多达 25 个作业(线程)尝试访问数据库。如果你的pool设置为 10,多余的 worker 必须等待其他 worker 完成,并且可能某些线程不得不等待太久。

因此,要么将连接池的大小扩大到至少比 25(sidekiq worker 的数量)高一点的值,就像您所做的那样,要么 run your sidekiq通过像 sidekiq -c 5 一样运行它来减少 worker .最后,始终确保允许足够的传入连接 on the MySQL side (默认情况下超过 100)。

关于mysql - Sidekiq 在 AWS RDS 上返回 "ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626557/

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