Дедупликация

Очереди FIFO реализуют механизм дедупликации сообщений с помощью набора параметров, обеспечивающих доставку и обработку сообщений только один раз и в порядке их отправки.

Дедупликация по идентификатору

Сообщения, отправляемые в очереди FIFO, получают идентификатор для дедупликации отправляемых в очередь сообщений (MessageDeduplicationId). Если сообщение с идентификатором принято, то все остальные сообщения с таким же идентификатором будут поступать в очередь, но не будут доставляться получателю в течение пятиминутного интервала дедупликации. Если идентификатор не указан, отправка сообщения в очередь FIFO не выполняется.

Каждое сообщение, отправляемое в очередь FIFO, должно иметь уникальный идентификатор дедупликации. Если сообщение будет доставлено, то другие сообщения с таким же идентификатором не будут доставляться.

Параметр MessageDeduplicationId доступен получателю сообщения и может использоваться для устранения проблем с доставкой сообщений.

Если сообщение отправлено успешно, а ответ о приеме потерян, то Message Queue не распознает дубликат, если будет принято сообщение с тем же идентификатором после истечения интервала дедупликации.

Дедупликация по содержимому

В очередях может быть включена дедупликация по содержимому сообщения. Сообщения, отправленные в такую очередь без идентификатора дедупликации, будут получать его автоматически. Автоматически сгенерированный идентификатор представляет собой хэш-сумму тела сообщения, созданную по алгоритму SHA-256.

Работа механизма дедупликации зависит от настроек дедупликации очередей и сообщений:

  1. Если у отправленного сообщения нет идентификатора дедупликации и в очереди FIFO не включена дедупликация по содержимому, то отправителю вернется ответ с ошибкой.
  2. Если у отправленного сообщения есть идентификатора дедупликации и в очереди FIFO включена дедупликация по содержимому, то будет использовано значение идентификатора из сообщения.

Сообщения с одинаковым содержимым, поступающие в очередь с включенной дедупликацией по содержимому сообщения во время интервала дедупликации, считаются дубликатами: получателю доставляется только одна копия сообщения.

Если в очередь со включенной дедупликацией по содержимому отправить одно сообщение и следом другое с таким же содержимым, но с идентификатором дедупликации, оба сообщения будут считаться дубликатами и получателю будет доставлено только одно из них.

Повторные попытки получения сообщений

При получении сообщений из очередей FIFO используется идентификатор попытки получения сообщений — ReceiveRequestAttemptId.

Если приложение потеряло связь с Message Queue, этот идентификатор можно использовать для повторного получения набора сообщений. Параметр можно использовать в течение 5 минут после вызова метода ReceiveMessage. При запросе сообщений идентификатор можно указывать явно или использовать автоматически сгенерированные идентификаторы.

Повторное получение сообщений с тем же ReceiveRequestAttemptId возможен, если состав и видимость сообщения не менялись. Во время таймаута видимости повторные запросы сообщений с одинаковыми ReceiveRequestAttemptId будут возвращать одни и те же сообщения с одинаковым параметром ReceiptHandle.