Удаление сообщения из очереди SQS FIFO: срок действия маркера получения истек
Я переключился на очередь FIFO и получил это сообщение об ошибке при попытке удалить сообщение из очереди
Value {VALUE} for parameter ReceiptHandle is invalid. Reason: The receipt handle has expired.
Похоже, что ошибка происходит, потому что я пытался удалить сообщение после visibility timeout
истек Я изменил тайм-аут видимости по умолчанию 0 на максимум, 12 часов, это частично решило проблему. Иногда может случиться, что сообщение будет находиться в моей очереди более 12 часов, прежде чем я смогу его выполнить и затем удалить, поэтому я снова получу сообщение об ошибке. Есть ли какое-либо решение, чтобы увеличить время ожидания видимости более 12 часов или обойти эту ошибку другим способом?
5 ответов
Вы можете сделать это в Консоли AWS, но хитрость в том, что вы должны делать это, пока процесс опроса еще активен.
Например, когда вы проводите опрос в течение 10 секунд и 10 сообщений, вам необходимо удалить сообщение в течение 10 секунд или до прибытия 10-го сообщения, в зависимости от того, что произойдет раньше, после остановки опроса ваше окно удаления закроется.
Вы получаете ошибку при остановке опроса
Настройте продолжительность опроса и количество сообщений
TLDR: Вы хотите посмотреть на ChangeMessageVisibility
API.
подробности
Причина тайм-аута видимости состоит в том, чтобы убедиться, что процесс, обрабатывающий сообщение, неожиданно не умер, и разрешить обработку сообщения другому работнику.
Если вашему процессу требуется больше времени, чем настроенное время ожидания видимости, ему по сути нужно отправить некоторый сигнал в SQS, который говорит: "Я все еще жив и работаю над этим сообщением". Это то что ChangeMessageVisibility
для.
Если у вас есть большая изменчивость во времени, необходимом для потребления и обработки сообщения, я предлагаю установить время ожидания видимости по умолчанию для небольшого размера и заставить ваших работников издавать "сердцебиение" (используя ChangeMessageVisibility
), чтобы указать, что они все еще живы и работают над сообщением. Таким образом, вы все равно можете сравнительно быстро восстановиться, когда работник законно отказывает.
Обратите внимание, что есть также ChangeMessageVisibilityBatch
для этого на пакетах сообщений.
Попробуйте увеличить значение параметра VisibilityTimeout в sqs.receive_message() для сообщения, которое вы хотите удалить с помощью ReceiptHandle
Измените VisibilityTimeout:0 на VisibilityTimeout:60, он работает
const params = {
AttributeNames:[
"SentTimestamp"
],
MaxNumberOfMessages:10,
MessageAttributeNames:[
"All"
],
QueueUrl:queueURL,
VisibilityTimeout:60,
WaitTimeSeconds:0,
};
sqs.receiveMessage(params,function (err,data) {
console.log(data);
if (err) {
console.log("Receive Error", err);
}else if (data.Messages) {
let deleteParams = {
QueueUrl: queueURL,
ReceiptHandle: data.Messages[0].ReceiptHandle
};
sqs.deleteMessage(deleteParams, function(err, data) {
if (err) {
console.log("Delete Error", err);
} else {
console.log("Message Deleted", data);
}
});
}
});