Мне нужна функциональность «перепроверить позже», которая в традиционных веб-приложениях может быть достигнута, например, с помощью очередей на основе Redis, причем каждая очередь имеет временную метку (в мире PHP это имеет Laravel функциональность из коробки).
Мое решение для этого в Lambda состояло в том, чтобы отправить сообщение в ту же очередь, в которую подается функция, но на этот раз с некоторой задержкой. И так будет продолжаться до тех пор, пока мы не узнаем, что пришло время снова проверить объект (API, статус, что угодно).
Вот моя функция полностью:
exports.handler = async (event) => {
const AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-2' });
let sqs = new AWS.SQS({apiVersion: '2012-11-05'});
let messageBody = event.Records[0].body;
let details = JSON.parse(messageBody);
console.log("Received event. Count is: " + details.counter);
details.counter += 1;
messageBody = JSON.stringify(details);
await sqs.sendMessage({
DelaySeconds: 10,
MessageBody: messageBody,
QueueUrl: 'https://sqs.us-east-2.amazonaws.com/123456/TestRequeueFeature'
});
};
В тесте выше , это очередь с именем TestRequeueFeature
, которая вызывает функцию. Под конец я отправляю сообщение с задержкой в десять секунд. Тем не менее, это сообщение никогда не появлялось (я имею в виду, что функция не была вызвана снова, хотя прошло несколько минут). В CloudWatch есть только один журнал для этой функции, который был, когда я запускал ее с помощью тестового события. Помимо этого, сообщение, кажется, исчезло.
Что я могу сделать, чтобы диагностировать это? На самом деле это происходит в реальном проекте, поэтому я решил создать отдельный тест и посмотреть, как он будет работать.