Amazon SQS キューを非常に簡単な方法で使用しています。通常、メッセージは書き込まれ、すぐに表示されて読み取られます。場合によっては、メッセージが書き込まれ、数分間キューに In-Flight (Not Visible) のままになることがあります。コンソールから見れます。受信メッセージ待機時間は 0 で、デフォルトの可視性は 5 秒です。数分間、または何らかの方法でそれを解放する新しいメッセージが書き込まれるまで、そのままになります。数秒の遅延は問題ありませんが、60 秒以上の遅延は問題です。
常に長いポーリングを行う 8 つのリーダー スレッドがあるため、何かがそれを読み取ろうとしていないわけではありません。
編集:明確にするために、消費者の読み取りはまったくメッセージを返さず、コンソールが開いているかどうかに関係なく発生します。このシナリオでは、1 つのメッセージのみが関与し、コンシューマーには見えないキューに置かれています。
他の誰かがこの動作を見たことがありますか?それを改善するために私にできることはありますか?
私が使用しているJavaのSDKは次のとおりです。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.2</version>
</dependency>
読み取りを行うコードは次のとおりです (最大 = 10、最大待機 = 0 スタートアップ構成):
void read(MessageConsumer consumer) {
List<Message> messages = read(max, maxWait);
for (Message message : messages) {
if (tryConsume(consumer, message)) {
delete(message.getReceiptHandle());
}
}
}
private List<Message> read(int max, int maxWait) {
AmazonSQS sqs = getClient();
ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
rq.setMaxNumberOfMessages(max);
rq.setWaitTimeSeconds(maxWait);
List<Message> messages = sqs.receiveMessage(rq).getMessages();
if (messages.size() > 0) {
LOG.info("read {} messages from SQS queue",messages.size());
}
return messages;
}
これが発生している場合、「read ..」のログ行は表示されません。そのため、コンソールにアクセスして、メッセージが存在するかどうかを確認する必要があります。