2014-01-13 5 views
4

У меня есть требование, чтобы прочитать все сообщения в моей очереди Амазонки SQS в 1, а затем отсортировать их на основе созданной метки времени и сделать бизнес-логику на нем.Amazon SQS Long Polling не возвращает все сообщения

Чтобы убедиться, что все хосты SQS отмечены для сообщений, я включил длительный опрос. То, как я это делал, - установить время ожидания по умолчанию для очереди как 10 секунд. (Любое значение больше 0 будет включать длительный опрос).

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

AmazonSQSClient sqsClient = new AmazonSQSClient(new ClasspathPropertiesFileCredentialsProvider()); 
sqsClient.setEndpoint("sqs.us-west-1.amazonaws.com"); 
String queueUrl = "https://sqs.us-west-1.amazonaws.com/12345/queueName"; 
ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest().withQueueUrl(queueUrl).withMaxNumberOfMessages(10).withWaitTimeSeconds(20); 
List<Message> messages = sqsClient.receiveMessage(receiveRequest).getMessages(); 

У меня есть 3 сообщений в очереди и каждый раз, когда я запускаю код, я получить другой результат, иногда я получаю все 3 сообщения, иногда только 1. таймаут видимости я поставил в 2 секунды, просто устранить сообщения становятся невидимыми в качестве причины не видеть их в чтении. Это ожидаемое поведение при коротком опросе. Долгий опрос должен устранить несколько опросов. Что-то я здесь делаю неправильно?

Благодаря

ответ

16

Длинный опрос предполагается устранить несколько опросов

Нет, долго опрос предполагается устранить большое количество пустых опросов и ложных пустых ответов, когда messsages действительно доступен. Длительный опрос в SQS не будет сидеть и ждать максимального количества времени ожидания, просто ищет больше вещей, чтобы вернуться, или продолжать поиск, как только он что-то нашел. Длинный опрос в SQS только ждет достаточно долго, чтобы найти что-то :

Длинный опрос позволяет сервис Amazon SQS ждать, пока сообщение не будет доступно в очереди перед отправкой ответа. Поэтому, если время соединения не истечет, ответ на запрос ReceiveMessage будет содержать хотя бы одно из доступных сообщений (если есть) и максимальное количество, запрошенное в вызове ReceiveMessage.

http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html(курсив добавлен)

Итак, “ что-то ” что SQS находит и возвращает может быть все сообщения (до вашего максимального), или подмножество сообщений, поскольку, как уже упоминалось, SQS является распределенной системой. Вероятно, было решено архитектурное решение между «возвратом как можно быстрее после того, как мы что-то нашли» и «найти всю систему для всего возможного до максимального количества сообщений, которые клиент примет» ...и, учитывая эти альтернативы, представляется разумным, что большинство приложений предпочли бы более быстрый ответ «дайте мне все, что вы можете, как можно быстрее».

Вы не знаете, что вы фактически истощили очередь, пока не получите пустой ответ от длительного опроса.

+1

Получение пустого возврата из длинного опроса не гарантирует, что очередь пуста. Лучший индикатор пустоты возвращается обратно, когда вы запрашиваете количество сообщений в очереди, но это также не гарантируется. – tster

+0

@tster Я никогда не сталкивался с условием, когда длинный опрос возвратил 0 сообщений, несмотря на то, что в очереди были сообщения, хотя это теоретически возможно - однако это противоречит документированному утверждению о том, что длинный ответ опроса «будет содержать по крайней мере одно из доступных сообщений ", если они есть. Если это произойдет, это должно быть исключение. –

1

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

Вам просто нужно продолжать звонить, пока не убедитесь, что у вас столько предметов, сколько вы ожидали, или что очередь была опустошена.

+0

Затем длинный опрос не помогает в этом прецеденте. Несмотря на то, что он просматривает все размещенные на сервере сообщения и поэтому знает обо всех сообщениях, находящихся в очереди, он иногда может возвращать подмножество сообщений. Что-то просто не звучит правильно. – kaputabo

+1

Kaputabo, Длительный опрос не предназначен для помощи в этом случае использования. Это правда. На самом деле, похоже, что SQS не был предназначен для вашего случая использования. Может быть, вам стоит воспользоваться DynamoDB? – tster

-2

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

Я провел несколько экспериментов вокруг этого и обнаружил, что количество сообщений, возвращаемых в ответе, приближается к числу запрошенных сообщений при увеличении количества сообщений в очереди. Как правило, с 1000 сообщениями в очереди, в моих экспериментах я мог видеть, что он возвратил 10 сообщений (что, кстати, максимальное число, которое может быть возвращено для запроса на чтение) каждый раз. На самом деле это поведение наблюдалось и для короткого опроса. Даже с более 100 сообщениями количество возвращенных сообщений не было равно 10, хотя хороший процент этих запросов возвратил 10 сообщений. Очевидно, это не гарантировано, но это то, что вы обычно видели.

Я зарегистрировал результаты моих экспериментов в одном из своих блогов - разместив ссылку на то же самое ниже, если вы хотите увидеть более подробную информацию об эксперименте.

http://pragmaticnotes.com/2017/11/20/amazon-sqs-long-polling-versus-short-polling/

+0

@Mortiz Я изменил свой пост с более подробной информацией. Можете ли вы, ребята, просмотреть его еще раз и, при необходимости, пересмотреть –

Смежные вопросы