type
status
date
slug
summary
tags
category
icon
password
理論
AWSでのメッセージ処理における重要な知識
1. SQSの可視性タイムアウト
- メッセージが処理中の間、他のコンシューマーがそのメッセージを受信できない時間。
- 設定のポイント:
- 処理時間 + バッファ時間を考慮する。
- 短すぎると処理中のメッセージが再配信され、無駄な処理やエラーを引き起こす。
2. デッドレターキュー (DLQ)
- 処理できなかったメッセージを格納するキュー。
- 主な設定:
maxReceiveCount
:メッセージをデッドレターキューに送るまでの再試行回数。- 高すぎると不要な処理が増加し、低すぎると正常な処理が妨げられる。
3. Auto Scalingとスケールイン保護
- Auto Scalingは負荷に応じてインスタンスを追加・削除。
- スケールイン保護:
- 処理中のインスタンスがスケールインで終了しないように保護。
- 長時間の処理タスクには必須。
4. トラブルシューティングの基本
- CloudWatch Logsやメトリクスで以下を確認:
- インスタンスのスケールイン/アウトのタイミング。
- メッセージの再試行履歴とDLQへの移動状況。
- アプリケーションログでの処理エラーの有無。
実践的な設定ポイント
- 可視性タイムアウトを処理時間に適した値(通常1.5倍程度)に設定。
- スケールイン保護を有効化し、処理中のインスタンスが終了しないようにする。
- DLQの監視を行い、問題が発生したメッセージを分析して根本原因を特定。
実践
略
一問道場
問題 #141: AWSでのビデオ処理に関する問題
ある会社がAWSクラウドで動画を処理するため、Auto Scalingグループ内のAmazon EC2インスタンスを使用しています。
1本の動画の処理には30分かかり、Amazon Simple Queue Service (Amazon SQS)キュー内の動画数に応じてEC2インスタンスがスケールインおよびスケールアウトします。
設定内容
- SQSキューにリドライブポリシーを設定し、ターゲットのデッドレターキューと
maxReceiveCount
を1に指定。
- SQSキューの可視性タイムアウトを1時間に設定。
- デッドレターキューにメッセージがある場合、Amazon CloudWatchアラームが開発チームに通知を送信。
発生している問題
1日に数回、デッドレターキューにメッセージが入り、動画が正常に処理されていないと通知が送られる。
しかし、アプリケーションのログにはエラーが記録されていない。
解決策を選択してください:
A. EC2インスタンスの終了保護を有効にする。
B. SQSキューの可視性タイムアウトを3時間に更新する。
C. 処理中のインスタンスにスケールイン保護を設定する。
D. リドライブポリシーを更新し、
maxReceiveCount
を0に設定する。解説
背景となる問題
- 動画の処理には 30分 かかる。
- SQSキューの 可視性タイムアウト は 1時間 に設定されている。
- リドライブポリシーでは
maxReceiveCount
= 1 が指定されている。
- デッドレターキューにメッセージが送られる条件は以下の通り:
- メッセージが指定回数(
maxReceiveCount
)以上再処理された。 - メッセージが可視性タイムアウトの間に適切に処理されなかった。
現象:
- メッセージがデッドレターキューに移動しているが、アプリケーションログにエラーは記録されていない。
可能性:
- メッセージが正常に処理されず、再度受信される前に可視性タイムアウトが切れてしまう。
- スケールイン時に、処理中のEC2インスタンスが終了してしまい、動画の処理が中断される。
各選択肢の評価
A. EC2インスタンスの終了保護を有効にする
- 効果: EC2インスタンスの終了を防ぐ設定。
- 問題点: デッドレターキューの問題は、特定のインスタンスが終了することが原因とは断定できない。したがって、この選択肢は不十分です。
B. SQSキューの可視性タイムアウトを3時間に更新する
- 効果: 可視性タイムアウトを延長することで、処理が完了するまでメッセージが他のインスタンスに渡されるのを防ぐ。
- 問題点: 処理時間は30分であるため、1時間のタイムアウトは十分です。これ以上の延長は不要で、別の根本的な原因を特定する必要があります。
C. 処理中のインスタンスにスケールイン保護を設定する
- 効果: 処理中のEC2インスタンスがスケールインによって終了されるのを防ぐ。
- 適切性: 動画の処理中にインスタンスが終了すると、メッセージが再処理対象となり、デッドレターキューに移動する可能性が高まります。この設定は問題の原因を直接解決します。
D. リドライブポリシーを更新し、maxReceiveCount
を0に設定する
- 効果: メッセージをデッドレターキューに即座に移動させる。
- 問題点: この設定では、動画が処理される前にメッセージがデッドレターキューに移動してしまうため、問題を悪化させます。
正解:C. 処理中のインスタンスにスケールイン保護を設定する
理由:
- スケールインによって処理中のインスタンスが終了し、動画の処理が中断されることで、メッセージが再処理されてデッドレターキューに移動する可能性があります。
- スケールイン保護を有効にすることで、処理中のインスタンスが誤って終了するのを防ぎ、問題を解決できます。
補足情報
- デッドレターキューの問題が完全に解消されない場合は、CloudWatch Logsでインスタンスの終了履歴やアプリケーションの状態を確認することで、さらなる原因特定を行う必要があります。
- 作者:みなみ
- 链接:https://tangly1024.com/資格勉強/16fd7ae8-88e2-800b-b3d7-ca0fcc5fa60a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章