Le Blog Amazon Web Services

Amélioration des performances de traitement des flux en temps réel avec Amazon Kinesis Data Streams et AWS Lambda

Les analyses en temps réel des données du métier sont essentielles pour une prise de décision informée et la qualité du service qu’une entreprise peut offrir à ses clients. Par exemple, les services de streaming comme Netflix traitent des milliards de flux chaque jour pour vous aider à regarder vos émissions préférées. Et les spécialistes de l’audio grand public comme Sonos surveillent un milliard d’événements par semaine pour améliorer l’expérience de leurs clients. Ces entreprises prenant des décisions informées par les données collectent et analysent quotidiennement des quantités massives de données en temps réel.

Aperçu d’Amazon Kinesis Data Streams

Pour aider à ingérer des données en temps réel ou à diffuser des données en streaming à grande échelle, beaucoup de clients AWS se tournent vers Amazon Kinesis Data Streams. Kinesis Data Streams peut capturer en continu des gigaoctets de données par seconde à partir de centaines de milliers de sources. Les données collectées sont disponibles en l’espace de quelques millisecondes, permettant des analyses en temps réel.

Pour assurer ce débit massif à l’échelle, Kinesis Data Streams s’appuie sur des partitions, qui sont des unités de débit permettant le parallélisme. Une partition fournit un débit d’ingestion de 1 Mo / seconde ou 1000 enregistrements / seconde. Une partition a également un débit sortant de 2 Mo / seconde. Au fur et à mesure que vous ingérez plus de données, Kinesis Data Streams peut ajouter plus de partitions. Les clients intègrent souvent des milliers de partitions pour un seul flux.

Une diffusion améliorée

L’un des principaux avantages du traitement de flux (en anglais “streaming”) est d’avoir plusieurs applications consommatrices, chacune consommant des données du même flux de Kinesis Data Streams. Par exemple, une application peut agréger les enregistrements dans le flux de données, les mettre dans un batch et écrire le batch dans Amazon Simple Storage Service (Amazon S3) pour une rétention à long terme. Une autre application peut enrichir les enregistrements et les écrire dans une table Amazon DynamoDB. Enfin, dans le même temps, une troisième application peut filtrer le flux et écrire un sous-ensemble des données dans un autre flux de Kinesis Data Streams pour, par example, être consommé par une application de notification.

Depuis 2018, Kinesis Data Streams a annoncé la prise en charge de la diffusion améliorée en HTTP/2 pour une diffusion plus rapide. La méthode de diffusion améliorée est une option que vous pouvez utiliser pour consommer des flux de Kinesis Data Streams à une capacité de traitement supérieure. La diffusion améliorée vous permet d’atteindre un débit sortant plus élevé sans avoir à provisionner plus de flux ou de partitions dans le même flux.

Lorsque vous utilisez l’option de diffusion améliorée, créez d’abord un consommateur Kinesis Data Streams. Un consommateur est une connexion isolée au flux qui fournit un débit sortant de 2 Mo / seconde. Un flux de Kinesis Data Streams peut prendre en charge jusqu’à cinq consommateurs, offrant une capacité de débit sortant combinée de 10 Mo / seconde / partition. Au fur et à mesure que le flux évolue de manière dynamique en ajoutant des partitions, la quantité de débit évolue également à travers les consommateurs.

Nous allons considérer l’exigence de 10 Go de capacité de sortie pour faire le calcul en utilisant la diffusion améliorée.

Flux Partitions Entrée Consommateurs Sortie
1 1 1000 enregistrements/seconde
or 1 Mo/seconde
5 10 Mo/seconde
1 1000 1,000,000 enregistrements/seconde
or 1000 Mo/seconde
5 10,000 Mo/seconde
or 10 Go/seconde

Diffusion améliorée avec les fonctions AWS Lambda

Depuis novembre 2018, AWS Lambda a annoncé la prise en charge de la diffusion améliorée et de HTTP/2. Les fonctions Lambda peuvent désormais être déclenchées à l’aide du modèle de diffusion amélioré pour réduire la latence. Ces améliorations augmentent la quantité de données en temps réel pouvant être traitées dans les applications serverless (sans serveur, en français), comme illustré dans le diagramme suivant.

En plus d’utiliser l’option de diffusion améliorée, vous pouvez toujours attacher des fonctions Lambda au flux à l’aide de l’API GetRecords, comme auparavant. Vous pouvez attacher jusqu’à cinq consommateurs avec des fonctions Lambda à une capacité de débit sortant de 2 Mo / seconde et deux ou trois autres fonctions Lambda partageant une capacité de débit sortant unique de 2 Mo / seconde. Ainsi, la diffusion améliorée vous permet de prendre en charge jusqu’à huit fonctions Lambda simultanément.

HTTP/2

La technologie de streaming HTTP/2 augmente la capacité de sortie de Kinesis Data Streams. De plus, elle permet la livraison de données des producteurs aux consommateurs en 70 millisecondes ou mieux (une amélioration de 65% par rapport à l’utilisation des APIs HTTP/1) dans des scénarios typiques. Ces fonctionnalités vous permettent de créer des applications plus rapides, plus réactives, hautement parallèles et sensibles à la latence en plus de Kinesis Data Streams.

Coûts

En utilisation le service Kinesis Data Streams sur la région Paris, eu-west-3, une entreprise supporte un coût horaire de 0,0179 USD par partition et des frais PUT de 0,0173 USD par million d’unités. Vous pouvez provisionner une diffusion améliorée pour une partition de consommateur pour un coût horaire de 0,0179 USD et de 0,0155 USD par Go de frais de récupération de données. Ces frais s’appliquent uniquement à la région eu-west-3. Pour voir une liste complète des prix, consultez la tarification d’Amazon Kinesis Data Streams.

Description de l’application

Pour démontrer l’utilisation de la diffusion améliorée de Kinesis Data Streams avec les fonctions Lambda, nous avons créé une application simple. Elle intègre des données de capteur IoT simulées et les stocke dans une table DynamoDB ainsi que dans un bucket (compartiment) Amazon S3 pour une utilisation ultérieure. Nous aurions pu le faire dans une seule fonction Lambda. Cependant, pour garder les choses simples et mettre en place une meilleur séparation des responsabilités, nous l’avons divisée en deux fonctions distinctes.

Déploiement de l’application

Nous avons créé l’application Kinesis-Enhanced-Fan-Out-to-DDB-S3 et l’avons rendue disponible via l‘AWS Serverless Application Dispository. Vous pouvez déployer l’application dans votre compte AWS et l’application peut être déployée dans la région eu-west-3. Sur la page d’état du déploiement, vous pouvez surveiller les ressources en cours de déploiement.

Une fois toutes les ressources déployées, vous devriez voir une bannière verte.

Exploration de l’application

Prenez un moment pour examiner la liste des ressources déployées. Les deux fonctions AWS Lambda, DDBFunction et S3Function, reçoivent des données et écrivent respectivement dans DynamoDB et Amazon S3. De plus, deux rôles AWS Identity and Access Management (AWS IAM) ont été créés pour permettre aux fonctions d’accéder à leurs cibles respectives.

Il existe également deux consommateurs, DDBConsumer et S3Consumer, qui fournissent une sortie isolée à un débit de 2 Mo / seconde. Chaque consommateur est connecté au flux KinesisStream et déclenche les fonctions AWS Lambda lorsque des données sont émises. En outre, il existe une table DynamoDB appelée DBRecords et un compartiment S3 appelé S3Records. Enfin, il existe une application de consommation de flux, comme indiqué dans le diagramme suivant.

Test de l’application

Maintenant que votre application est déployée, testez-la en injectant des données dans Kinesis Data Stream. Il y a plusieurs moyens pour se faire. Vous pouvez créer votre producteur de données à l’aide de Kinesis Producer Library (KPL), ou vous pouvez créer une application qui utilise le kit AWS Software Development Kit (SDK) pour diffuser des données. Cependant, il existe un moyen plus simple qui convient à vos objectifs dans cet article: Amazon Kinesis Data Generator. La façon la plus simple d’utiliser cet outil est d’utiliser le générateur hébergé et de suivre les instructions de configuration.

Une fois le générateur configuré, vous devez disposer d’une URL personnalisée pour générer des données pour votre flux de données Kinesis. Dans vos étapes de configuration, vous avez créé un nom d’utilisateur et un mot de passe. Connectez-vous au générateur en utilisant ces informations d’identification.

Lorsque vous êtes connecté, vous pouvez générer des données pour votre test de flux.

  1. Pour Region, choisissez eu-west-3.
  2. Pour Stream/delivery stream, sélectionnez votre flux. Cela devrait commencer par serverlessrepo.
  3. Pour Records per second, conservez la valeur par défaut de 100.
  4. Dans l’onglet Template 1, nommez le modèle Sensor1.
  5. Utilisez le modèle suivant:
    {
        "sensorId": {{random.number(50)}},
        "currentTemperature": {{random.number(
            {
                "min":10,
                "max":150
            }
        )}},
        "status": "{{random.arrayElement(
            ["OK","FAIL","WARN"]
        )}}"
    }
  6. Choisissez Envoyer les données.
  7. Après quelques secondes, choisissez Arrêter l’envoi de données.

À ce stade, si tout s’est déroulé comme prévu, vous devriez voir les données à la fois dans votre table DynamoDB et dans le compartiment Amazon S3. Suivez les étapes suivantes pour vérifier que votre processus de diffusion améliorée a fonctionné.

  1. Sur la console AWS Lambda, choisissez Applications.
  2. Sélectionnez l’application qui commence par serverlessrepo-.
  3. Choisissez Ressources, DDBFunction. Cela ouvre la console DynamoDB.
  4. Choisissez Elements.

La capture d’écran suivante montre les 100 premiers éléments que votre base de données a absorbés à partir de la DDBFunction attachée à KinesisStream via DDBConsumer.

Ensuite, vérifiez votre compartiment Amazon S3,

  1. Sur la console Lambda, choisissez Applications.
  2. Sélectionnez l’application qui commence par serverlessrepo-.
  3. Choisissez Resources, S3Records. Cela ouvre la console S3.

Comme dans DynamoDB, vous devriez maintenant voir les données de test provenant du capteur IoT stockées dans votre compartiment S3 pour une utilisation ultérieure.

Maintenant que la démonstration fonctionne, nous tenons à souligner les avantages de ce que vous venez de faire. En utilisant la méthode de répartition améliorée, vous avez amélioré vos performances de la manière suivante :

  1. HTTP/2 a réduit le temps entre les producteurs de données et les consommateurs à <= 70 MS, une amélioration de 65%,
  2. Au niveau du consommateur, chaque consommateur a une vitesse de débit sortante isolée de 2 Mo / seconde. Parce que vous utilisez deux consommateurs, cela donne deux fois plus de performances.

Conclusion

Combiner les fonctions AWS Lambda et Amazon Kinesis Data Streams pour collecter et analyser d’énormes quantités de données est une architecture courante pour nos clients. D’autre part, la technologie de diffusion améliorée couplée à HTTP/2 permet d’utiliser plus de fonctions en même temps sans réduire pour autant le débit.

Si vous ne connectez qu’une ou deux fonctions AWS Lambda à un flux de données, la diffusion améliorée n’est peut-être pas la solution idéale. Cependant, si vous attachez plus de trois fonctions Lambda à un flux pour la manipulation en temps réel et le routage des données, il est judicieux d’évaluer cette option.

 

Article original contribué par Eric Johnson et adapté en français par Chen Shi, Solutions Architect dans les équipes AWS France.