web-dev-qa-db-fra.com

Comment puis-je échouer un message SQS spécifique dans un lot d'un lambda?

J'ai une lambda avec un déclencheur SQS. Quand il est touché, un lot d'enregistrements de SQS se situe (généralement environ 10 à la fois, je pense). Si je retourne un code d'état ayant échoué du gestionnaire, tous les 10 messages seront récupérés. Si je retourne un code de réussite, ils seront tous retirés de la file d'attente. Et si 1 sur ces 10 messages ont échoué et je veux réessayer juste celui-là?

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.'
    };
};

Dois-je re-ajouter manuellement de ce message à la file d'attente? Ou puis-je retourner un statut de mon gestionnaire qui indique qu'un message a échoué et doit être réessayé?

15
user2719094

Vous devez supprimer programmatiquement chaque message après la traitement avec succès.

Vous pouvez donc avoir un drapeau défini sur TRUE si l'une des personnes des messages a échoué et que vous pouvez soulever une erreur après le traitement de tous les messages dans un lot, des messages réussi sont supprimés et que d'autres messages seront retraités en fonction des stratégies de réessayer.

0
Prashanna

Vous devez concevoir votre application IIN diffrente Voici quelques idées non meilleures mais résoudra votre problème.

Solution 1:

  • Créer des files d'attente de livraison SQS - SQ1
  • Créer des files d'attente de retard selon la condition requise requise SQ2
  • Créer une queue de lettre morte SDL
  • Maintenant, à l'intérieur de la fonction Lambda Si le message a échoué dans SQ1, supprimez-le sur SQ1 et déposez-le sur SQ2 pour réessayer toute fonction Lambda appelée asynchrone est recouverte de deux fois avant que l'événement soit rejeté. Si les tentatives échouent.

  • Si une fois échoué après avoir donné une nouvelle réessation dans la queue de la lettre morte SDL.

Remarque: lorsqu'un mappage de source d'événement SQS est initialement créé et activé, ou apparaissez d'abord après une période sans trafic, le service Lambda commencera ensuite à interroger la file d'attente SQS à l'aide de cinq connexions d'interrogation longues parallèles, conformément à la documentation AWS, la durée par défaut Pour un long sondage de AWS Lambda à SQS est de 20 secondes.

Solution 2:

Utilisez AWS Stepfunction

Stealfunction appellera Lambda et gérera la logique de réessayer sur une défaillance avec une bassin exponentielle configurable si nécessaire.

** Solution 3: **

Evénement planifié de CloudWatch pour déclencher une fonction Lambda qui sondre pour échec.

La gestion des erreurs pour une source d'événement donnée dépend de la manière dont la Lambda est invoquée. Amazon Cloudwatch Events invoque votre fonction Lambda asynchrone.

0
vaquar khan