【问题标题】:AWS Lambda, NodeJS, pg-promise library - High latency > 10000msAWS Lambda、NodeJS、pg-promise 库 - 高延迟 > 10000 毫秒
【发布时间】:2021-12-20 22:13:33
【问题描述】:

我有一个使用 NodeJS 的 AWS Lambda 函数设置,它使用 pg-promise 库调用 postgres 数据库以检索数据 - 然后发送 HTTPS GET 请求等,但其余的都不重要。

我最初使用的是“pg”库,但遇到了连接关闭和异步问题,这就是我切换到 pg-promise 的原因(这确实解决了我的另一个问题!)。使用常规 pg 库,我的预期延迟为

我已将代码归结为一个简单的查询,我从最近 3 次测试运行中获得了这些响应时间:11790.78 毫秒、11232.22 毫秒、12002.04 毫秒。每次超过 10000ms...

编辑:固定代码

const pgp = require('pg-promise')();
const https = require('https');
const xmlParser = require('xml2js').Parser();

const client = pgp({
    database: process.env.DATABASE,
    host: process.env.HOST,
    port: process.env.PORT,
    user: process.env.USERNAME,
    password: process.env.PASSWORD
});

exports.handler = function(event, context, callback) {  
    client.one("SELECT period FROM pay WHERE company='XXX' ORDER BY moddate DESC LIMIT 1;")
        .then(function(data) {
            callback(null, {
                "statusCode": 200,
                "headers": {
                    'Content-Type' : 'application/json'
                },
                "body": data.period
            });
        })
        .catch(function(error) {
            console.error(error);
        });
};

如上所述,我在使用“pg”库时没有遇到延迟问题,所以我知道 lambda-RDS postgres 连接没有问题。

有人知道这是为什么吗?

谢谢,

【问题讨论】:

  • 我想知道您是否可以尝试直接调用connect...知道它是打开连接还是实际查询花费了这么多时间会很有趣。您的callback 也不应该在您的.then 内...或者切换到await 承诺?现在你将在你的承诺有机会解决之前执行callback...不确定这对 Lambda 有什么影响。
  • 请参阅async example,了解如何使用 Promise 编写此代码。或者重写它,使处理程序不是异步的,并且回调在thencatch 处理程序中执行。目前,代码对于任一场景(异步或回调)都不正确。
  • @David784 谢谢。我更新了提供的代码示例以反映回调的正确处理。然而,问题仍然存在。我去做你推荐的连接测试,看看结果如何
  • @jarmod 谢谢我已经更新了代码,但是问题仍然存在

标签: node.js postgresql amazon-web-services pg-promise


【解决方案1】:

最后我发现问题出在哪里......让 pg-promise 自动关闭连接池是导致延迟的原因。

链接一个

.finally(pgp.end);

.catch 给了我 200 毫秒的响应时间。

谢谢大家

【讨论】:

  • 这不仅仅是关闭连接。这会关闭池中的所有连接,然后关闭池,因此无法再使用它。它不能很好地解决您的问题,更像是一个讨厌的黑客。任何并行运行的查询也会终止。
  • @vitaly-t 那么解决这个问题的正确方法是什么?当我重新实现其余逻辑时,我现在遇到了问题。在检索到该数据后,它运行另一个查询以获取它循环的用户 ID - 发送一个 GET 请求,然后将这些响应写回数据库。你可以想象我现在在尝试最后一次写回数据库时遇到连接关闭问题(在循环内)......谢谢先生
  • 众所周知,Lambda 是连接问题最多的系统。它应用最激进的连接关闭策略。这会产生许多问题。 There has been a lot of Lambda-related issues logged therefore。我建议看看那些。我不能更具体,我自己也不使用 Lambda。
  • @vitaly-t 谢谢...我最终能够通过处理一半的请求和 lambda 以及应用程序本身的最终数据库写回来解决这个问题...我 am 在最终 .then 解析之后使用 .finally(pgp.end) 作为链,所以我认为这不会被认为是“hacky”?
猜你喜欢
  • 2020-04-05
  • 2017-12-07
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2013-06-19
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多