Действительно ли очередь AWS SQS FIFO является точной - однократная доставка
У меня есть код обработчика функции ниже.
public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
{
foreach (var message in @event.Records)
{
// Do work
// If a message processed successfully delete the SQS message
// If a message failed to process throw an exception
}
}
Это очень сбивает с толку, хотя я не обрабатываю логику проверки для создания записей в моей базе данных (уже существующей), я вижу записи базы данных с одним и тем же идентификатором, созданные дважды, что означает, что одно и то же сообщение обрабатывается более одного раза!
В моем коде я удаляю сообщение после успешной обработки или генерирую исключение в случае сбоя, предполагая, что все оставшиеся упорядоченные сообщения просто вернутся в очередь, видимую для любого потребителя для повторной обработки, но я вижу, что код не работает, потому что одни и те же записи создаются дважды за успешное мероприятие.
Является ли AWS SQS FIFO одноразовой доставкой или мне не хватает какой-то политики обработки повторных попыток?
Вот как я удаляю сообщение после успешной обработки.
var deleteMessageRequest = new DeleteMessageRequest
{
QueueUrl = _sqsQueueUrl,
ReceiptHandle = message.ReceiptHandle
};
var deleteMessageResponse =
await _amazonSqsClient.DeleteMessageAsync(deleteMessageRequest, cancellationToken);
if (deleteMessageResponse.HttpStatusCode != HttpStatusCode.OK)
{
throw new AggregateSqsProgramEntryPointException(
$"Amazon SQS DELETE ERROR: {deleteMessageResponse.HttpStatusCode}\r\nQueueURL: {_sqsQueueUrl}\r\nReceiptHandle: {message.ReceiptHandle}");
}
Документация очень четко об этом
«Очереди FIFO обеспечивают однократную обработку, что означает, что каждое сообщение доставляется один раз и остается доступным до тех пор, пока потребитель не обработает его и не удалит».
Они также упоминают о защите вашего кода от повторных попыток, но это сбивает с толку для типа очереди с одноразовой доставкой, но затем я вижу ниже в их документации, что сбивает с толку.
Ровно-однократная обработка. В отличие от стандартных очередей, очереди FIFO не содержат повторяющихся сообщений. Очереди FIFO помогают избежать отправки дубликатов в очередь. Если вы повторите попытку действия SendMessage в течение 5-минутного интервала дедупликации, Amazon SQS не добавит в очередь никаких дубликатов.
Потребительские повторные попытки (как это возможно)?
Если потребитель обнаруживает неудачное действие ReceiveMessage, он может повторить попытку столько раз, сколько необходимо, используя тот же идентификатор попытки получения запроса. Предполагая, что потребитель получает хотя бы одно подтверждение до истечения тайм-аута видимости, несколько повторных попыток не влияют на порядок сообщений.
1 ответ
Это была полностью ошибка нашего приложения и того, как мы обрабатываем агрегированные конечные точки Eventssourcing из-за небезопасной поддержки потоков.