SqSメッセージがキューにインフライトしたままになることがある理由
疑問点
Amazon SQSのキューを非常にシンプルな方法で使っています。通常、メッセージは書き込まれ、すぐに表示され、読み込まれます。時折、メッセージが書き込まれ、数分間キューにIn-Flight(Not Visible)されたままになることがあります。コンソールから見ることができます。Receive-message-wait timeは0、Default Visibilityは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の起動時設定)。
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 .." のログ行は決して表示されず、そのために私はコンソールに入り、メッセージがそこにあるかどうかを確認することになります。
どのように解決するのですか?
あなたが見ているものを間違って解釈しているようです。
メッセージ "in flight" は配信待ちではなく、すでに配信されているがコンシューマによってさらに処理されていないメッセージです。
メッセージは、クライアントに送信されたがまだ削除されていない場合、またはまだ可視性ウィンドウの終わりに達していない場合、飛行中であるとみなされます。
コンシューマがメッセージを受信したとき、ある時点でそのメッセージを削除するか、あるいは タイムアウトを増加させる を増加させるリクエストを送信しなければなりません。 さもなければ、タイムアウトが過ぎると、メッセージは再び見えるようになります。 可視化タイムアウトは、コンシューマがこれらの処理のいずれかを実行しなければならないまでの時間です。
しかし、その「何か」には、コンソール自体も含まれます。コンソールで「メッセージの表示/削除」を選択したときに表示されるポップアップに注意しましょう (ただし、「二度と表示しない」チェックボックスをオンにした場合を除きます)。
コンソールに表示されたメッセージは、コンソールがメッセージのポーリングを停止するまで、他のアプリケーションで利用することはできません。
コンソールに表示されるメッセージは、"View/Delete Messages"画面からキューを観察している間、"in flight"です。
明らかな意味をなさない部分は、デフォルトの可視性タイムアウトがわずか 5 秒で、コード内の何もそのタイムアウトを増やしていない場合、メッセージが数分間飛行中であることです...しかし... しかし、...これは、消費者がメッセージを適切に廃棄しないためにタイムアウトしてすぐに再送信され、メッセージの単一のインスタンスが飛行中に残っているような印象を与えることによって、ほぼ完全に説明することができます。
関連
-
[解決済み] Amazon S3のファイルやフォルダの名前を変更する方法は?
-
[解決済み] AWSでロールを引き受ける際のRoleSessionNameのユースケースとパフォーマンスへの影響について
-
[解決済み] スケジュールされたイベントソースをトリガーとするラムダ関数を設定するには、terraformを使用します。
-
[解決済み] MSCK REPAIR TABLEは裏で何をしているのか、なぜこんなに遅いのか?
-
[解決済み] DNS名foo.を持つRRSetはゾーンバーで許可されていません。
-
[解決済み] List<AWS::EC2::Subnet::Id> 型のパラメータをネストしたCloudFormationテンプレートに渡す。
-
[解決済み] kubectlエラー EKSクラスタにアクセスする際、サーバーにログインする必要がある(Unauthorized)。
-
[解決済み] AWSプライベートリンクとVPCエンドポイント
-
[解決済み] EC2でインスタンスを削除するには?
-
[解決済み] パスワードなしでec2インスタンスにscp(セキュアコピー)する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】aws cli: update-kubeconfig が期待通りに動作しない。
-
[解決済み] aws-cliで認証するとUnrecognizedClientExceptionエラーが発生する。
-
[解決済み] Amazon SQSを複数のコンシューマで使用する
-
[解決済み] AWS S3 Bucketの名前を変更する方法
-
[解決済み] エラー: networkMode 'awsvpc' が指定された場合、ネットワーク構成を提供する必要があります。
-
[解決済み] amazon cloudfront と amazon s3 transfer acceleration の違いは何ですか?
-
[解決済み] リクエストに含まれるセキュリティトークンの有効期限が切れている
-
[解決済み] DynamoDBのBatchGetItemとQueryの違いとは?
-
[解決済み] s3バケットから複数ファイルをコピーする
-
[解決済み] AWS - Disconnected : サポートされている認証方法がありません (サーバーは :publickey を送信)