Sử dụng một ứng dụng máy khách Java Tôi đang truy vấn hàng đợi SQS cho các tin nhắn. Hàng đợi có 12.000 tin nhắn khi thiết lập để thử nghiệm. Tôi đang sử dụng openJDK với aws-java-sdk mới nhất (software.amazon.awssdk 2.10.62) pom.xml được hiển thị thêm.
Vấn đề tôi đang gặp phải là mặc dù đã cài đặt maxNumberOfMessages (10) tôi chỉ nhận được 3. Tôi hiểu rằng đó không phải là sự đảm bảo tối đa về số lượng tin nhắn tuy nhiên không có sự thay đổi nào về số lượng tin nhắn được trả về. Nó luôn luôn là 3.
Tài liệu AWS: MaxNumberOfMessages Số lượng tin nhắn tối đa sẽ trả về. Amazon SQS không bao giờ trả lại nhiều tin nhắn hơn giá trị này (tuy nhiên, có thể trả lại ít tin nhắn hơn). Giá trị hợp lệ: 1 đến 10. Mặc định: 1. Loại: Số nguyên bắt buộc: Không
Tin nhắn tiêu dùng sử dụng bỏ phiếu ngắn
Khi bạn tiêu thụ thư từ hàng đợi bằng cách bỏ phiếu ngắn, Amazon SQS lấy mẫu một tập hợp con các máy chủ của nó (dựa trên phân phối ngẫu nhiên có trọng số) và trả về tin nhắn từ chỉ những máy chủ đó. Do đó, một yêu cầu receiveMessage cụ thể có thể không trả về tất cả các tin nhắn của bạn. Tuy nhiên, nếu bạn có ít hơn 1.000 tin nhắn trong hàng đợi của mình, một yêu cầu tiếp theo sẽ trả về tin nhắn của bạn. Nếu bạn tiếp tục tiêu thụ từ hàng đợi của mình, Amazon SQS sẽ lấy mẫu tất cả các máy chủ của nó và bạn sẽ nhận được tất cả các tin nhắn của mình.
Vì vậy, chúng tôi đã thử nghiệm hai máy khách trong java bằng cách sử dụng cả sdk aws cũ và máy khách mới hơn có cùng kết quả. Luôn chỉ có 3 tin nhắn trở lại.
Thật thú vị nếu thay vì chạy ứng dụng bên ngoài (trên máy tính để bàn hùng mạnh của tôi), bạn chạy nó dưới dạng AWS Lambda, bạn nhận được 10 tin nhắn. Thử nghiệm lambda này được thực hiện bằng JavaScript bởi một đồng nghiệp.
Vì vậy, câu hỏi vẫn là tại sao chúng ta chỉ nhận được 3 tin nhắn cho mỗi yêu cầu và dường như trong lambda bạn có thể nhận được 10 tin nhắn.
Cho rằng có một chi phí cho mỗi yêu cầu là phân phối ngẫu nhiên có trọng số dựa trên lợi nhuận của amazon =))
Phương pháp kiểm tra 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>