【发布时间】:2019-02-16 08:57:23
【问题描述】:
我有一个 Lambda 函数,它从 SNS 接收消息并使用自定义模块查询外部数据库并将计算结果输出到数据库。该模块工作正常:Lambda 通过 VPC 访问互联网并成功连接到数据库并将所需数据输出到数据库,但我仍然收到错误“任务在 3.00 秒后超时”。模块本身使用 sequelize、async/await 和 Promise。
我增加了最大超时时间,唯一的区别是错误消息中的秒数增加到了超时限制。我尝试保留并发,但错误仍然存在。我的函数的每个部分都很好,除了回调永远不会解决,产生超时错误。我尝试使用和不使用“context.callbackWaitsForEmptyEventLoop”语句运行该函数,使用该语句运行它只会使代码在任何评级引擎函数完成之前返回。这是评级引擎代码:https://github.com/elizajanus/rating-engine-module
数据库连接是否有可能在我的自定义模块中没有关闭并阻止代码完全完成导入的功能?或者它可能是别的东西?这个问题可能联系了:https://github.com/sequelize/sequelize/issues/8468
const {RatingEngine} = require('./rating-engine');
exports.handler = (event, context, callback) => {
const message = event.Records[0].Sns.Message;
RatingEngine(message, message.d_customer_id,
message.d_total_distance_travelled);
callback(null, 'move record created in database');
};
【问题讨论】:
-
您的代码挂在 RatingEngine 上,您需要从 RatingEngine 发布代码,否则无法发现它挂在该函数中的位置。
-
我刚刚意识到我在 context.callbackWaitsForEmptyEventLoop = false 中缺少大写。更正此问题只会使该函数跳过几乎所有我的自定义模块代码并在任何完成之前返回回调,因此请划掉该行。我将在接下来的十分钟左右链接到 github 上自定义模块的审查版本。我认为这也可能与我的问题有关:github.com/sequelize/sequelize/issues/8468
-
这里是 Lambda 中使用的 RatingEngine 函数的代码(提前道歉,这是在“让它工作”阶段):github.com/elizajanus/rating-engine-module
-
RatingEngine 函数本身在 index.js 中
-
您的代码非常广泛,您不应该在错误时拒绝()吗?我还建议您添加 aws x ray 并根据该功能内部达到的步骤保存消息,它将帮助您发现问题所在。
标签: mysql node.js aws-lambda sequelize.js