web-dev-qa-db-ja.com

SqSメッセージが時々キューで処理中のままになるのはなぜですか

Amazon SQSキューを非常に簡単な方法で使用しています。通常、メッセージは書き込まれ、すぐに表示および読み取りされます。場合によっては、メッセージが書き込まれ、数分間キュー内に飛行中(表示されない)のままになります。コンソールから見ることができます。受信メッセージ待機時間は0、デフォルトの可視性は5秒です。数分間、または何らかの形でそれを解放する新しいメッセージが書き込まれるまで、そのままです。数秒の遅延は問題ありませんが、60秒以上は問題ありません。

常に長いポーリングを行う8つのリーダースレッドがあるため、何かがそれを読み取ろうとしていないわけではありません。

編集:明確にするために、コンシューマの読み取りはメッセージをまったく返さず、コンソールが開いているかどうかに関係なく発生します。このシナリオでは、関与するメッセージは1つだけであり、消費者には見えないキューに座っています。

他の誰かがこの動作を見て、それを改善するために私にできることはありますか?

Java私が使用している場合のSDKは次のとおりです。

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-Java-sdk</artifactId>
  <version>1.5.2</version>
</dependency>     

読み取りを行うコードは次のとおりです(max = 10、maxwait = 0 startup config):

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 ..」のログ行は、これが発生しているときは決して表示されず、そのためにコンソールにアクセスしてメッセージが存在するかどうかを確認します。

40
Jerico Sandhorn

見ているものを誤って解釈しているように聞こえます。

「飛行中」のメッセージは配信が保留されていません。それらはすでに配信されているが、消費者によってさらに処理されていないメッセージです。

メッセージがクライアントに送信されたが、まだ削除されていないか、可視性ウィンドウの最後に到達していない場合、メッセージは飛行中と見なされます。

http://docs.aws.Amazon.com/AmazonCloudWatch/latest/monitoring/sqs-metricscollected.html

コンシューマーがメッセージを受信すると、ある時点でメッセージを削除するか、そのメッセージのリクエストを送信するか、 タイムアウトを増やす にする必要があります。それ以外の場合、メッセージはタイムアウトの期限が切れると再び表示されます。消費者がこれらのいずれかを実行しなかった場合、メッセージは自動的に再び表示されます。可視性タイムアウトは、これらのいずれかを実行する前に消費者が持つ時間です。

メッセージが既に受信されていない場合、メッセージは「飛行中」であってはなりません。ただし、「何か」にはコンソール自体が含まれている場合があります。コンソール(「これを表示しない」チェックボックスを既にチェックしていない場合):

コンソールに表示されるメッセージは、コンソールがメッセージのポーリングを停止するまで、他のアプリケーションで使用できません。

コンソールが「メッセージの表示/削除」画面からキューを監視している間、コンソールに表示されるメッセージは「飛行中」です。

明らかな意味をなさない部分は、デフォルトの可視性タイムアウトがわずか5秒であり、コード内でタイムアウトが増加していない場合、メッセージが「数分間」飛行していることです...しかし...消費者がメッセージを適切に破棄せず、タイムアウトしてすぐに再配信され、実際にメッセージが一時的に表示に戻ったときに、メッセージの単一のインスタンスが飛行中に残っているような印象を与えます。すぐに別の消費者から申し立てを受け、再び機内に持ち帰りました。

68

メッセージを送信またはロックし、数秒以内にメッセージの新しいリストを取得しようとすると発生する場合があります。 Amazon SQSは、データを複数のサーバーと複数のデータセンターに保存します http://aws.Amazon.com/sqs/faqs/#How_reliably_is_my_data_stored_in_Amazon_SQS

これらの問題を取り除くには、適切な結果を出すためにキューにもっと時間がかかるように、もっと待つ必要があります。

1
Satish Pandey