aho*_*ota 6 mysql aws connection-pooling amazon-rds
我在测试我的 Lambda 函数时遇到了一些问题。我的测试,我并行N执行我的 Lambda 函数。在我的 lambda 函数中,我通过 Knex 检索数据库连接。我正在搞乱 db init 中的设置pool: { min: 0, max: [1 or 5] },这似乎修复/破坏了一些东西,这取决于我代码中的其他东西。
执行我的 lambda 函数 20 次会输出正确的结果,但是,当我达到 500 次时(我期望在生产中看到的很容易超过这个),事情开始破裂。我遇到了诸如Error: ER_CON_COUNT_ERROR: Too many connections, 之类的错误Error: pool is draining and cannot accept work(如果我knex.destroy()在 lambda 函数的末尾使用 Knex 的接口)。在 AWS Lambda 和 RDS 中处理连接和池以实现规模化的正确方法是什么?如果我在 AWS 上运行相同的压力测试,我在本地机器上看到的问题是否会重现?
分离数千个进程来完成任务的一小部分很简单。但效率低下。“过程”是重量级的。线程有点重。可以有数千个 MySQL 连接,但不能同时连接。
在任何多进程或多线程环境中,“太多”都会减慢速度。这是因为操作系统(或某些实体)正在做大量工作来共享不足的资源。例如,MySQL 可以处理数百个空闲连接,但在超过几十个活动连接时就会陷入困境。当超过这个值时,最好沿着链向上到达客户端,并限制产生新连接的频率。
我不熟悉您提到的其他产品,但我建议将同时活动减少到数十个,而不是数百个。
或者想办法。在您的应用程序中,“迭代”而不是“递归”。同时,请记住,MySQL 更乐意处理数据“向量”(表),而不是处理单个行。也许您可以将应用程序中的一些“并行”内容作为“向量”推送到 MySQL 中?双赢:更少的连接;MySQL 的效率更高。