【发布时间】:2020-01-22 03:51:48
【问题描述】:
我们使用 AWS Serverless 和 NodeJS 创建了两个 lamdba 函数,一个是发送者,另一个是接收者,在这两者之间有一个标准 SQS,它从发送者 lambda 接收数据,如果有任何消息到达,它会自动触发接收者 lambda 函数在 SQS。
在这里,我们能够成功地将所有消息从发送者 lambda 发送到 SQS(根据日志),但在接收者 lambda 处,我们没有收到所有消息。
为了测试这个场景,我从邮递员那里发送了 1000 条消息,并测试了发送者将所有消息完美地发送到 SQS,但接收者只从中获得了 986 条随机消息,其中一些随机消息被遗漏了。
我也尝试过将 SQS 类型改为 FIFO 而不是标准,但 lambda 不支持。
这里是发送者和接收者函数的代码:
发件人:
sender: () => {
const sqs = new AWS.SQS({ apiVersion: "2019-08-09" });
let body = [
{ id : "1" },
{ id : "2" },
{ id : "3" }
]
let params = {
DelaySeconds: 10,
QueueUrl: url,
MessageBody: JSON.stringify(body)
};
sqs.sendMessage(params, function (err, data) {
if (err) {
callback(true, null);
} else {
callback(false, data);
}
});
}
接收者:
receiver: () => {
event.Records[0].body = JSON.parse(event.Records[0].body);
async.timesSeries(event.Records[0].body.length, (i, next) => {
const params = {
TableName: "user",
Key: {
id: "1"
}
};
dynamoDb.get(params).promise()
.then(result => {
//save user
})
.catch(error => {
//throw err
next();
});
}, () => {
console.log("deleting message");
const deleteParams = {
QueueUrl: "queue_url",
ReceiptHandle: event.Records[0].receiptHandle
};
sqs.deleteMessage(deleteParams, function (err, data) {
if (err) {
//throw error
} else {
//success
}
});
});
}
【问题讨论】:
-
你找到解决办法了吗?
标签: node.js amazon-web-services aws-lambda amazon-sqs serverless