Мы создали две функции lamdba с использованием AWS Serverless и NodeJS, одна из которых является отправителем, а другая - получателем, и между ними есть одна стандартная SQS, которая получает данные от лямбды-отправителя и автоматически запускает функцию-лямбда получателя, если поступает какое-либо сообщениев SQS.
Здесь мы можем успешно отправить все сообщения от лямбды-отправителя в SQS (согласно журналам), но в лямбда-получателе мы не получаем все сообщения.
Комупротестировав этот сценарий, я отправил 1000 сообщений от почтальона и проверил, что отправитель отлично отправлял все сообщения в SQS, но получатель получал только 986 случайных сообщений, некоторые случайные сообщения были пропущены между ними.
Я также попробовал тип SQS для FIFO вместо стандартного, но он не поддерживается лямбда-выражением.
Вот код функции отправителя и получателя:
SENDER:
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
}
});
});
}