Використовуючи клієнтську програму Java, я запитую чергу SQS для повідомлень. У черзі 12000 повідомлень як налаштування для тестування. Я використовую 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>