🎱
FIFOキューのSQSトリガーのLambdaの注意点
結論
同じメッセージグループIDの場合、FIFOキューのSQSトリガーで起動したLambdaがエラーになった場合、SQSのデータは削除されないので、後続のメッセージは処理されない。
今思うと基本的なことですが、人のコードを改修していた際にこれに気づかず1時間ほど無駄にしてしまったので備忘として残します。
FIFOキューのSQSの基本
- メッセージの順序保証:メッセージがキューに追加された順序で消費されることが保証される。
- 一度だけの処理保証:各メッセージが一度だけ配信されることが保証される。
- 制限されたスループット:標準キューに比べてスループットが制限されています。デフォルトでは、1秒あたり最大300のトランザクション。(高スループットFIFOキューでは1500-3000トランザクション)
- 重複排除:メッセージ重複排除IDを利用して重複排除可能。
注意点
同じメッセージグループIDの場合、FIFOキューは順序を守るために、メッセージが削除されない限り次のメッセージは処理されません。
SQSトリガーのLambdaにおいてはエラーが発生するとSQSのメッセージは削除されないので、次に進むことができません。
動作イメージ
メッセージグループID A: message1->message2->message3
結果:message2でLambdaがエラーとなった場合、default visible timeoutが終わった後は、message2からの処理となる(message2が正常終了するかDLQに移動されるまでmessage3は処理されない)
メッセージグループID A: message1
メッセージグループID B: message2
メッセージグループID C: message3
結果:message2でLambdaがエラーとなった場合でも、message3の処理が可能。
対処方法
- 複数回失敗してDLQに入るのを待つ
- 別のキューに入れるなどしてLambdaを正常終了させる(SQSのメッセージを削除する)
- 順序が重要でない場合などはそもそも、メッセージグループIDを変える(バラバラにする
)*そもそもFIFOキューの必要性があるかを検討した方がいいと思われる
Discussion