Utilizzando un'applicazione client Java sto interrogando una coda SQS per i messaggi. La coda ha 12.000 messaggi come impostazione per il test. Sto usando openJDK con l'ultimo aws-java-sdk (software.amazon.awssdk 2.10.62) pom.xml è mostrato più in basso.
Il problema che sto vedendo è che nonostante l'impostazione di maxNumberOfMessages (10) ottengo sempre solo 3. Comprendo che è un massimo non una garanzia del numero di messaggi, tuttavia non vi è alcuna esitazione nel numero di messaggi restituiti. Sono sempre 3.
Documentazione AWS: MaxNumberOfMessages Il numero massimo di messaggi da restituire. Amazon SQS non restituisce mai più messaggi di questo valore (tuttavia, potrebbero essere restituiti meno messaggi). Valori validi: da 1 a 10. Predefinito: 1. Tipo: intero Richiesto: no
Consumo di messaggi utilizzando il polling breve
Quando consumi messaggi da una coda utilizzando il polling breve, Amazon SQS campiona un sottoinsieme dei suoi server (basato su una distribuzione casuale ponderata) e restituisce messaggi solo da quei server. Pertanto, una particolare richiesta RiceviMessage potrebbe non restituire tutti i tuoi messaggi. Tuttavia, se nella coda sono presenti meno di 1.000 messaggi, una richiesta successiva restituirà i messaggi. Se continui a consumare dalle tue code, Amazon SQS campiona tutti i suoi server e ricevi tutti i tuoi messaggi.
Quindi abbiamo testato due client in Java usando sia il vecchio aws sdk che il più recente con gli stessi risultati. Restano sempre solo 3 messaggi.
È interessante notare che invece di eseguire l'applicazione esternamente (sul mio potente desktop) la esegui come AWS Lambda ricevi 10 messaggi. Questo test lambda è stato eseguito utilizzando JavaScript da un collega.
Quindi la domanda rimane: perché riceviamo solo 3 messaggi per richiesta e apparentemente in Lambda puoi riceverne 10.
Dato che esiste un costo per richiesta è la distribuzione casuale ponderata basata sull'utile amazon =))
Metodo di prova 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>