Java 클라이언트 응용 프로그램을 사용하여 메시지에 대한 SQS 대기열을 쿼리하고 있습니다. 대기열에는 테스트를위한 설정으로 12,000 개의 메시지가 있습니다. 최신 aws-java-sdk (software.amazon.awssdk 2.10.62)와 함께 openJDK를 사용하고 있습니다. pom.xml이 더 아래에 표시되어 있습니다.
내가보고있는 문제는 maxNumberOfMessages (10) 설정에도 불구하고 3을 얻는 것입니다. 메시지 수를 보장하지 않는 최대 값이라는 것을 이해하지만 반환 된 메시지 수에는 흔들림이 없습니다. 항상 3입니다.
AWS 설명서 : MaxNumberOfMessages 반환 할 최대 메시지 수입니다. Amazon SQS는이 값보다 더 많은 메시지를 반환하지 않지만 더 적은 메시지가 반환 될 수 있습니다. 유효한 값 : 1 ~ 10. 기본값 : 1. 유형 : 정수 필수 : 아니요
짧은 폴링을 사용하여 메시지 소비
짧은 폴링을 사용하여 대기열에서 메시지를 사용하는 경우 Amazon SQS는 서버의 하위 집합 (가중 무작위 배포를 기반으로)을 샘플링하고 해당 서버에서만 메시지를 반환합니다. 따라서 특정 ReceiveMessage 요청이 모든 메시지를 리턴하지는 않습니다. 그러나 대기열에 메시지가 1,000 개 미만이면 후속 요청에서 메시지를 반환합니다. 대기열에서 계속 소비하면 Amazon SQS가 모든 서버를 샘플링하고 모든 메시지를 수신합니다.
그래서 우리는 이전 aws sdk와 새로운 결과를 사용하여 java에서 두 개의 클라이언트를 테스트했습니다. 항상 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>