Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Видимость
Полученное сообщение SQS остаётся в очереди, невидимое в течение тайм-аута видимости, пока его не удалят или пока оно не вернётся для следующего получения.
Схема текстом
- Хранится видно следующему получению → В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1: ReceiveMessage
- В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1 → DeleteMessage: удалено
- В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1 → Тайм-аут истёк
- В обработке невидимо в течение тайм-аута видимости, идентификатор получения, счётчик получений + 1 → ChangeMessage Visibility(0)
- Тайм-аут истёк → Снова видно следующее получение его засчитает
- ChangeMessage Visibility(0) → Снова видно следующее получение его засчитает
- Снова видно следующее получение его засчитает → После maxReceiveCount получений: перенесено в DLQ: при следующем получении
- 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).