Используя клиентское приложение Java, я запрашиваю очередь сообщений SQS. В очереди 12 000 сообщений в качестве настройки для тестирования. Я использую openJDK с последней версией aws-java-sdk (software.amazon.awssdk 2.10.62). Pom.xml показан ниже.
Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря на установку maxNumberOfMessages (10), я получаю только 3. Я понимаю, что это максимум, а не гарантия количества сообщений, однако колебания в количестве возвращаемых сообщений отсутствуют. Это всегда 3.
Документация AWS: MaxNumberOfMessages Максимальное количество возвращаемых сообщений. Amazon SQS никогда не возвращает больше сообщений, чем это значение (однако может быть возвращено меньше сообщений). Допустимые значения: от 1 до 10. По умолчанию: 1. Тип: Требуется целое число: Нет
Использование сообщений с помощью короткого опроса
Когда вы используете сообщения из очереди с помощью короткого опроса, Amazon SQS выбирает подмножество своих серверов (на основе взвешенного случайного распределения) и возвращает сообщения только от этих серверов. Таким образом, конкретный запрос ReceiveMessage может не вернуть все ваши сообщения. Однако, если в вашей очереди менее 1000 сообщений, последующий запрос вернет ваши сообщения. Если вы продолжаете получать из своих очередей, Amazon SQS производит выборку всех своих серверов, и вы получаете все свои сообщения.
Итак, мы протестировали двух клиентов в java, используя как старый aws sdk, так и новый с одинаковыми результатами. Всегда только 3 сообщения назад.
Интересно, что если вместо внешнего запуска приложения (на моем мощном рабочем столе) вы запускаете его как AWS Lambda, вы получаете 10 сообщений. Этот лямбда-тест был выполнен с использованием JavaScript коллегой.
Таким образом, остается вопрос, почему мы получаем только 3 сообщения на запрос, и, по-видимому, в лямбде вы можете получить 10.
Учитывая, что цена за запрос является взвешенным случайным распределением, основанным на прибыли амазонки =))
Метод испытаний SQS:
public void SQStart()
{
AwsBasicCredentials awsCreds = AwsBasicCredentials.create("accessKeyID", "secretKeyID");
AwsCredentialsProvider creds = StaticCredentialsProvider.create(awsCreds);
SqsClient sqs = SqsClient.builder().credentialsProvider(creds).region(Region.EU_WEST_1).build();
GetQueueUrlRequest getQueueRequest = GetQueueUrlRequest.builder()
.queueName(QUEUE_NAME)
.build();
String queueUrl = sqs.getQueueUrl(getQueueRequest).queueUrl();
for (int x =1; x < 100; x++) {
ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.maxNumberOfMessages(10)
.build();
List<Message> messages = sqs.receiveMessage(receiveMessageRequest).messages();
if (messages.size() > 3 ) {
System.out.println("YEY More than 3 Messages: "+ messages.size());
}
}
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>SQSTest</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.10.62</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sqs</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.10</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.720</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
источник
Ответы:
Понятно, что ваша цель здесь - снизить затраты, будь то путем отправки меньшего числа запросов в SQS или путем принуждения SQS доставлять максимальное количество доступных сообщений.
Как вы указали в своем вопросе, SQS не обязана доставлять максимальное количество доступных сообщений. Тем не менее, есть кое-что, о чем я хотел бы сообщить вам, если вы еще об этом не знаете.
Длинный опрос
Руководство разработчика сервиса Amazon Simple Queue гласит:
Все сообщения, которые вы отправляли в SQS, могли храниться на отдельных серверах. Как указано в документации, может быть запрошено только подмножество серверов, если ваша очередь настроена на использование короткого опроса . Я предполагаю, что вам не повезло при вызове
receiveMessage
и только3
были возвращены каждый раз.Если мы посмотрим на преимущества длинного опроса на одной странице документации, то в нем говорится:
Вторая пуля здесь очень важна. Даже если вы не видите пустых ответов, на серверах может храниться больше сообщений, которые не запрашиваются. Если вы включите длительный опрос, то, надеюсь, вы увидите увеличение количества возвращаемых сообщений, если предположить, что в общей сложности более 3 серверов.
Поэтому я предлагаю включить длинный опрос в вашей очереди. Для этого см. Страницу « Настройка длинного опроса» .
Как DevilCode упомянул в своем комментарии ниже, он смог решить свою проблему, используя очередь FIFO вместо стандартной очереди и включив длинный опрос по ней.
источник
Я думаю, что это аналогичный вопрос. Как указал Джейкоб, длительный опрос, кажется, является решением проблемы.
источник
Длинный опрос:
источник