Menggunakan aplikasi klien Java saya meminta antrian SQS untuk pesan. Antrian memiliki 12.000 pesan sebagai pengaturan untuk pengujian. Saya menggunakan openJDK dengan aws-java-sdk terbaru (software.amazon.awssdk 2.10.62) pom.xml ditampilkan lebih jauh ke bawah.
Masalah yang saya lihat adalah bahwa meskipun mengatur maxNumberOfMessages (10) saya hanya mendapatkan 3. Saya mengerti bahwa ini adalah maksimum bukan jaminan jumlah pesan tetapi tidak ada keraguan dalam jumlah pesan yang dikembalikan. Itu selalu 3.
Dokumentasi AWS: MaxNumberOfMessages Jumlah maksimum pesan yang akan dikembalikan. Amazon SQS tidak pernah mengembalikan lebih banyak pesan dari nilai ini (namun, lebih sedikit pesan yang dikembalikan). Nilai yang valid: 1 hingga 10. Default: 1. Tipe: Integer Diperlukan: No
Mengkonsumsi Pesan Menggunakan Polling Pendek
Saat Anda menggunakan pesan dari antrian menggunakan polling singkat, Amazon SQS mengambil sampel sebagian dari servernya (berdasarkan distribusi acak tertimbang) dan mengembalikan pesan hanya dari server tersebut. Dengan demikian, permintaan ReceiveMessage tertentu mungkin tidak mengembalikan semua pesan Anda. Namun, jika Anda memiliki kurang dari 1.000 pesan dalam antrian Anda, permintaan berikutnya akan mengembalikan pesan Anda. Jika Anda terus mengkonsumsi dari antrian Anda, Amazon SQS mengambil sampel semua servernya, dan Anda menerima semua pesan Anda.
Jadi kami telah menguji dua klien di java menggunakan aws sdk yang lebih lama dan yang lebih baru dengan hasil yang sama. Selalu hanya 3 pesan kembali.
Menariknya jika alih-alih menjalankan aplikasi secara eksternal (di desktop saya yang perkasa) Anda menjalankannya sebagai AWS Lambda Anda mendapatkan 10 pesan. Tes lambda ini dilakukan menggunakan JavaScript oleh seorang rekan.
Jadi pertanyaannya tetap mengapa kita hanya mendapatkan 3 pesan per permintaan dan tampaknya dalam lambda Anda bisa mendapatkan 10.
Mengingat ada biaya per permintaan adalah distribusi acak tertimbang berdasarkan laba amazon =))
Metode Tes 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>