75

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 ..」のログ行は表示されません。そのため、コンソールにアクセスして、メッセージが存在するかどうかを確認する必要があります。

4

2 に答える 2