【发布时间】:2023-03-17 10:07:01
【问题描述】:
我正在尝试从另一个 lambda 函数调用多个 lambda 函数(一个 lambda 函数,它将运行单独的并行进程)。第一个作为 cron lambda 运行,它只从 db 查询文档,然后使用 doc 的参数调用另一个 lambda。此 cron lambda 每五分钟运行一次并正确查询文档。我正在用两个文档测试第二个 lambda。问题在于,每次调用第二个 lambda 时,它只处理一个文档 - 每次处理另一个文档时,它在上一次调用时没有处理:
例如:
- 文档 1
- 文档 2
首先,调用第二个 lambda -> process doc 1
其次,调用第二个 lambda -> 处理文档 2
第三,调用第二个 lambda -> process doc 1
第二个 lambda 的第四次调用 -> 处理文档 2
等等……
第一个 (cron) lambda 代码:
aws.config.update({
region : env.lambdaRegion,
accessKeyId: env.lambdaAccessKeyId,
secretAccessKey: env.lambdaSecretAccessKey,
});
const lambda = new aws.Lambda({
region: env.lambdaRegion,
});
exports.handler = async (event: any, context: any) => {
context.callbackWaitsForEmptyEventLoop = false;
return new Promise(async (resolve, reject) => {
for (let i = 0; i < 100; i++) {
const doc = await mongo.db.collection('docs').
findOneAndUpdate(
{
status: 1,
lambdaProcessing: null,
},
{ $set: { lambdaProcessing: new Date() } },
{
sort: { processedAt: 1 },
returnNewDocument: true,
},
);
if (doc.value && doc.value._id) {
const params = {
FunctionName: env.lambdaName,
InvocationType: 'Event',
Payload: JSON.stringify({ docId: doc.value._id }),
};
lambda.invoke(params);
} else {
if (doc.lastErrorObject && doc.lastErrorObject.n === 0) {
break;
}
}
}
resolve();
});
};
第二个 lambda 函数:
exports.handler = async (event: any, ctx: any) => {
ctx.callbackWaitsForEmptyEventLoop = false;
if (event && event.docId) {
const doc = await mongo.db.collection('docs').findById(event.docId);
return await processDoc(doc);
} else {
throw new Error('doc ID is not present.');
}
};
【问题讨论】:
标签: node.js typescript amazon-web-services aws-lambda aws-sdk