Amazon Kinesis & AWS Lambda Tentatives
Je suis très nouveau pour Amazon Kinesis c'est peut-être juste un problème dans ma compréhension, mais dans le AWS Lambda FAQ il dit:
Le Amazon Kinesis et DynamoDB Streams dossiers envoyés à votre AWS Lambda fonction sont strictement sérialisé, par fragment. Cela signifie que si vous mettez les deux enregistrements dans le même fragment, Lambda garantit que votre fonction Lambda sera invoquée avec succès avec le premier enregistrement avant de elle est invoquée avec le deuxième enregistrement. Si l'invocation pour un temps records, est étranglé, ou des rencontres de toute autre erreur, Lambda va réessayer jusqu'à ce qu'il réussit (ou le record atteint son de 24 heures de l'expiration) avant de passer à l'enregistrement suivant. L'ordre des enregistrements dans différents fragments n'est pas garanti, et le traitement de chaque fragment qui se passe en parallèle.
Ma question est, ce qui se passe si, pour quelque raison que certaines des données malformées est mis sur un serveur par un producteur, et lorsque la fonction Lambda ramasse il erreurs et, ensuite, ne cesse de réessayer en permanence? Ensuite, cela signifie que le traitement de ce fragment serait bloqué pour 24 heures par l'erreur.
Est la meilleure pratique pour gérer les erreurs d'application comme ça en enveloppant le problème dans un message d'erreur personnalisé et l'envoi de cette erreur en aval le long avec tous les traités avec succès des dossiers et de laisser le consommateur? Bien sûr, ce n'est pas de l'aide dans le cas d'une erreur irrécupérable qui s'est écrasé le programme comme un pointeur null: encore une fois, nous serons de retour pour le blocage de la boucle de nouvelle tentative pour les prochaines 24 heures.
OriginalL'auteur Stefano | 2015-09-10
Vous devez vous connecter pour publier un commentaire.
Ne pas overthink, le Kinesis est juste une file d'attente. Vous devez consommer un enregistrement (ie. pop de la file d'attente) avec succès afin de procéder à la suivante. Tout comme une pile FIFO.
L'approche appropriée devrait être:
raison pour laquelle il a échoué. <- CATCH
DynamoDB. <- ENFIN
etc) c'est une autre histoire; car il peut affecter le traitement de toutes les
dossiers, pas seulement un.
Par ailleurs, si le traitement d'un dossier prend plus de 1 minute, il est évident que vous faites quelque chose de mal. Parce que Kinesis est conçu pour gérer des milliers d'enregistrements par seconde, vous ne devriez pas avoir le luxe de traitement de ces travaux longs pour chacun d'eux.
La question que vous demandez est un problème général de la file d'attente de systèmes, parfois appelé "toxiques message". Vous avez à gérer dans une logique d'entreprise pour être sûr.
http://www.cogin.com/articles/SurvivingPoisonMessages.php#PoisonMessages
Parce que quand vous vous arrêtez un "Kinesis Application Consommateur" nœud et de commencer plus tard; vous devriez être en mesure de continuer à partir du dernier point vous étiez.
Ah oui, ça a du sens.
Les deux réponses sont bonnes et dire des choses similaires, mais je vais vous donner la réponse à @az3 parce qu'il a répondu en premier.
Dans worker.java il appelle runProcessLoop et qu'il appelle shardConsumer.consumeShard() il y a il appelle checkAndSubmitNextTask() vérifie readyForNextTask ou pas . Si notReady il n'a pas de consommation de nouveaux records . Alors, comment est-il possible travailleur récupère de nouveaux enregistrements sans recordprocessor processus précédents.
OriginalL'auteur
C'est une question commune que sur le traitement des événements dans Kinesis et je vais essayer de vous donner quelques points de construire votre fonction Lambda de traiter ces questions avec "corrompu" de données. Car il est plus pratique d'avoir séparé les parties de votre système d'écriture pour les flux Kinesis et d'autres parties de la lecture de flux Kinesis, il est fréquent que vous avez de tels problèmes.
D'abord, pourquoi avez-vous de tels événements problématiques?
À l'aide de Kinesis pour traiter vos événements est une bonne façon de briser un système complexe qui fait à la fois l'avant-fin de traitement (service des utilisateurs finaux), et en même temps/code-fin de traitement (analyse des événements), en deux indépendant parties de votre système. L'avant-end les gens peuvent se concentrer sur leurs affaires, alors que les gens n'ont pas besoin de pousser des modifications au code du front-end, s'ils veulent ajouter des fonctionnalités à servir leurs analytique des cas d'utilisation. Kinesis est un tampon d'événements que les deux sauts de la nécessité pour la synchronisation ainsi simplifie le code de la logique métier.
Par conséquent, nous aimerions que les événements écrits dans le flux d'être flexible dans leur "schéma", et si le front-end des équipes souhaitez changer le format de l'événement, ajouter des champs, supprimer des champs, le changement de protocole ou les clés de chiffrement, ils devraient être en mesure de le faire aussi souvent qu'ils le souhaitent.
Maintenant, c'est les équipes qui sont la lecture à partir du flux pour être en mesure de traiter une telle souplesse des événements d'une manière efficace, et de ne pas casser leur traitement chaque fois qu'un tel changement se produit. Par conséquent, il devrait être bon que votre fonction Lambda va voir les événements qu'il ne peut pas traiter, et "poison pilule" n'est pas rare d'événement que vous pourriez vous attendre.
Deuxième, comment faire face à de tels événements problématiques?
Lambda de votre fonction sera d'obtenir un lot d'événements à traiter. Veuillez noter que vous ne devriez pas obtenir les événements un par un, mais dans de grands lots d'événements. Si vos lots sont trop petits, vous obtiendrez rapidement de gros lag sur le stream.
Pour chaque lot vous permettra d'effectuer une itération sur les événements, de les traiter et le check-point de DynamoDB la dernière séquence-id du lot. Lambda est en train de faire la plupart de ces étapes automatiquement (voir plus ici: http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-kinesis-events-adminuser-create-test-function.html):
C'est ce qui se passe dans le "heureux" chemin de, si tous les événements sont traités sans aucun problème. Mais si vous rencontrez le moindre problème dans le lot et vous n'avez pas "commettre" les événements avec le succès de la notification, le lot échouer et vous aurez tous les événements dans le lot à nouveau.
Maintenant, vous devez décider quelle est la raison de l'échec du traitement.
Temporaire problème (limitation de, problème de réseau...) - c'est OK pour attendre une seconde et essayez à nouveau pour une couple de fois. Dans de nombreux cas, le problème se résoudra de lui-même.
Occasionnel problème (de mémoire...) - il est préférable d'augmenter l'allocation de mémoire de la fonction Lambda ou de diminuer la taille des lots. Dans de nombreux cas, une telle modification permettra de résoudre le problème.
Constante l'échec, cela signifie que vous devez ignorer la problématique de l'événement (le mettre dans un DLQ - dead-lettre-de la file d'attente) ou de modifier votre code pour gérer.
Le problème est d'identifier le type de panne de votre code et de les traiter différemment. Vous devez écrire votre Lambda code dans un moyen de l'identifier (type d'exception, par exemple) et réagissent différemment.
Vous pouvez utiliser l'intégration avec CloudWatch pour écrire de tels échecs à la console et à créer pertinentes les alarmes. Vous pouvez utiliser le CloudWatch Logs aussi comme un moyen de vous connecter à votre "lettre morte-la file d'attente" et de voir quelle est la source du problème.
Vous pouvez gérer une liste avec la fonctionnalité de recherche pour éviter les doublons. Vous pouvez utiliser la table DynamoDB avec la clé que le courrier électronique, et la valeur du dernier e-mail envoyé. Une autre solution est d'utiliser Redis dans ElastiCache avec une durée de vie de l'e-mail clés. Avant de vous envoyer un email, vous vérifiez quand était la dernière fois qu'un email lui a été envoyé, et vous mettre à jour le dossier sur chaque envoi.
Je suis face au même scénario @CamJackson. DynamoDB prend désormais en charge durée de vie qui pourrait être utile pour ce
Où l'ordre des messages n'est pas important, serait de ré-insertion de l'80 échec des événements de nouveau pour le même flux (réessayer encore une fois très peu de temps) ou une nouvelle
retry_5_minutes_later
flux de travail?OriginalL'auteur