Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Видимость

Полученное сообщение SQS остаётся в очереди, невидимое в течение тайм-аута видимости, пока его не удалят или пока оно не вернётся для следующего получения.

Одно сообщение: получение его скрывает, удаление завершает, а истёкший тайм-аут или нулевая видимость возвращают егоХранитсявидно следующему получениюВ обработкеневидимо в течение тайм-аута видимости,идентификатор получения, счётчик получений + 1DeleteMessage:удаленоТайм-аутистёкChangeMessageVisibility(0)Снова видноследующее получение его засчитаетПосле maxReceiveCount получений:перенесено в DLQChangeMessageVisibility(n) скрывает его ещё на n секунд,но не дольше 12 часов после получения
Схема текстом
  1. Хранится видно следующему получению → В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1: ReceiveMessage
  2. В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1 → DeleteMessage: удалено
  3. В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1 → Тайм-аут истёк
  4. В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1 → ChangeMessage Visibility(0)
  5. Тайм-аут истёк → Снова видно следующее получение его засчитает
  6. ChangeMessage Visibility(0) → Снова видно следующее получение его засчитает
  7. Снова видно следующее получение его засчитает → После maxReceiveCount получений: перенесено в DLQ: при следующем получении
  8. ChangeMessageVisibility(n) скрывает его ещё на n секунд, но не дольше 12 часов после получения

Получение выдаёт сообщение вместе с идентификатором получения (receipt handle) и скрывает его от всех остальных получений на время тайм-аута видимости. Тайм-аут задаёт сама очередь: 30 секунд по умолчанию и до 12 часов, если получение не называет свой. SQS считает тайм-аут в целых секундах, не меньше одной. Потребитель удаляет сообщение по идентификатору этого получения.

Сообщение, которое не удалили вовремя, снова становится видимым и доставляется повторно. ChangeMessageVisibility задаёт новый тайм-аут, который отсчитывается от вызова. Нулевой тайм-аут сразу делает сообщение видимым. Тайм-аут, который закончился бы позже 12 часов после получения, SQS отвергает.

Каждое получение увеличивает ApproximateReceiveCount сообщения на единицу. Очередь с политикой перенаправления называет DLQ и maxReceiveCount от 1 до 1000. Сообщение, которое получили столько раз и не удалили, при следующем получении переносится в DLQ, а не доставляется. DLQ того же вида, что и исходная очередь: очереди FIFO нужна DLQ типа FIFO.

Аренды, которую нужно продлевать, в SQS нет. Пока обработчик держит доставку, этот крейт вызывает ChangeMessageVisibility в середине каждого тайм-аута, чтобы второе получение того же сообщения не обогнало медленный обработчик. Вторая половина тайм-аута остаётся на то, чтобы вызов дошёл до очереди. Продление прекращается, когда доставка завершается или удаляется. Очередь с нулевым тайм-аутом продления не получает.

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

Это поведение самого Amazon SQS (тайм-аут видимости, ChangeMessageVisibility, DLQ).