SQSトリガー付きのラムダがあります。ヒットすると、SQSからのレコードのバッチが入ります(通常、一度に約10個だと思います)。ハンドラーから失敗したステータスコードを返すと、10個のメッセージすべてが再試行されます。成功コードを返すと、それらはすべてキューから削除されます。 10個のメッセージのうち1個が失敗し、その1つだけを再試行したい場合はどうなりますか?
exports.handler = async (event) => {
for(const e of event.Records){
try {
let body = JSON.parse(e.body);
// do things
}
catch(e){
// one message failed, i want it to be retried
}
}
// returning this causes ALL messages in
// this batch to be removed from the queue
return {
statusCode: 200,
body: 'Finished.'
};
};
そのメッセージを手動でキューに再度追加する必要がありますか?または、1つのメッセージが失敗したため、再試行する必要があることを示すステータスをハンドラーから返すことはできますか?
あなたはここであなたのアプリを異なる方法で設計する必要がありますいくつかのアイデアは最善ではありませんがあなたの問題を解決します。
解決策1:
メッセージがsq1で失敗した場合、ラムダ関数内でメッセージをsq1で削除し、再試行のためにsq2にドロップします。非同期で呼び出されたLambda関数は、イベントが破棄される前に2回再試行されます。再試行が失敗した場合。
再試行後に再度失敗した場合は、デッドレターキューsdlに移動します。
注:SQSイベントソースマッピングが最初に作成されて有効になるか、トラフィックがない期間の後に最初に表示されると、Lambdaサービスは、AWSのドキュメントに従って、デフォルトの期間である5つの並列ロングポーリング接続を使用してSQSキューのポーリングを開始しますAWSLambdaからSQSへの長いポーリングの場合は20秒です。
解決策2:
AWSStepFunctionを使用する
StepFunctionはラムダを呼び出し、失敗時に再試行ロジックを処理し、必要に応じて構成可能な指数バックオフを使用します。
**ソリューション3:**
CloudWatchは、FAILEDをポーリングするLambda関数をトリガーするイベントをスケジュールしました。
特定のイベントソースのエラー処理は、Lambdaがどのように呼び出されるかによって異なります。 Amazon CloudWatch Eventsは、Lambda関数を非同期で呼び出します。