Почему ApproximateAgeOfOldestMessage в SQS не превышает 5 минут

Я использую Spring Cloud AWS сообщений (2.0.1.RELEASE) в Java для потребления из очереди SQS. Если это актуально, мы используем настройки по умолчанию, Java 10 и Spring Cloud Finchley.SR2,

Недавно у нас возникла проблема, из-за которой сообщение не могло быть обработано из-за ошибки приложения, что привело к исключению и отсутствию подтверждения (удаления) сообщения. Позднее сообщение повторяется (это желательно), вероятно, после истечения времени ожидания видимости (снова используются значения по умолчанию), здесь мы не настроили параметры.

Мы не обнаружили вышеупомянутую ошибку в течение нескольких дней, что означает, что количество полученных сообщений было очень высоким, и сообщение концептуально находилось в очереди некоторое время (уже несколько дней). Мы рассмотрели вопрос создания SQS-сигнализации для наблюдения за облаком, чтобы предупредить нас о подобной ситуации в будущем. Единственная подходящая метрика оказалась ApproximateAgeOfOldestMessage,

К сожалению, при наблюдении этой метрики я вижу это:

введите описание изображения здесь

Максимальный возраст не превышает 5 минут (несмотря на то, что я знал, что ему несколько дней). Если сообщение стареет каждый раз, когда происходит получение, при условии, что подтверждение не приходит и сообщение не удаляется - но вместо этого становится снова доступным после истечения времени ожидания видимости, разве этот график не должен быть намного выше?

Я не знаю, является ли это чем-то специфическим для того, как весенние облачные сообщения AWS потребляют сообщение, или это общая причуда SQS, но я ожидал, что если сообщение будет помещено в очередь 5 дней назад, и потребитель получит сообщение не будет успешно использовано, то максимальный возраст будет 5 дней?

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

Может ли кто-нибудь подтвердить, неверно ли мое ожидание, то есть именно так и ожидается, что SQS будет вести себя (он не учитывает возраст как время, прошедшее с момента, когда сообщение было впервые помещено в очередь, а вместо этого считает, что это время между приемом звонков?

1 ответ

Решение

Исходя из аналогичного вопроса на форумах AWS, это, по-видимому, ошибка с обычными очередями SQS, когда затрагивается только одно сообщение.

Чтобы получить полезную тревогу для этой проблемы, я бы предложил установить очередь недоставленных писем (где сообщения автоматически доставляются после настраиваемого числа потреблений без удалений) и сигнализировать о размере недоставленной буквы -queue (ApproximateNumberOfMessagesVisible).

Я думаю, это может быть связано с poison pillобработка по этой метрике. После 3+ попыток сообщение не будет включено в метрику. Из документов AWS:

После того, как сообщение получено три раза (или более) и не обработано, оно перемещается в конец очереди, а метрика ApproximateAgeOfOldestMessage указывает на второе самое старое сообщение, которое не было получено более трех раз. Это действие происходит, даже если в очереди есть политика повторной передачи.

Другие вопросы по тегам