Comment puis-je détecter et résoudre les problèmes liés aux exceptions ReadProvisionedThroughputExceeded dans Kinesis Data Streams ?

Date de la dernière mise à jour : 18/09/2020

Je rencontre une erreur ReadProvisionedThroughputExceeded dans Amazon Kinesis Data Streams. Quelle est la cause de ce problème, et comment puis-je le résoudre ?

Brève description

L'erreur ReadProvisionedThroughputExceeded se produit lorsque les appels GetRecords sont limités par Kinesis Data Streams sur une durée donnée.

Votre flux de données Amazon Kinesis peut être limité si les limites suivantes sont enfreintes :

  • Chaque partition peut prendre en charge jusqu'à cinq transactions de lecture par seconde (ou cinq appels GetRecords par seconde pour chaque partition).
  • Chaque partition peut prendre en charge jusqu'à un taux de lecture maximal de deux MiB/seconde.
  • GetRecords peut récupérer jusqu'à dix Mio de données par appel à partir d'un seul fragment, et jusqu'à 10 000 enregistrements par appel. Si un appel à GetRecords renvoie dix Mio de données, les appels ultérieurs effectués dans les cinq secondes suivantes entraînent une erreur.

Si vous rencontrez une erreur ReadProvisionedThroughputExceeded envisagez les approches suivantes :

  • Identifiez la cause racine de votre problème.
  • Identifiez une éventuelle microrafale.
  • Suivez les bonnes pratiques de Kinesis Data Streams.

Résolution

Identifiez la cause racine de votre problème

Pour identifier la cause racine de l'erreur ReadProvisionedThroughputExceeded dans Data Streams, surveillez le service Amazon Kinesis Data Streams avec Amazon CloudWatch. Faites attention aux métriques suivantes dans CloudWatch :

  • GetRecords.bytes : nombre d'octets récupérés à partir du flux de données Kinesis, mesuré sur une période spécifiée.
  • GetRecords.Records : nombre d'enregistrements extraits du flux de données Kinesis sur une période donnée.
  • ReadProvisionedThroughputExceeded : nombre d'appels GetRecords qui sont limités dans votre flux de données Kinesis.

Configurez votre tableau de bord CloudWatch pour afficher vos statistiques sous forme de somme avec la période définie sur une minute. Divisez ensuite la somme par 60 secondes pour obtenir une valeur moyenne.

Par exemple, si utilisez la valeur de métrique GetRecords.Records divisez Somme par 60 secondes pour calculer le nombre moyen d'enregistrements envoyés par seconde. Ensuite, vérifiez si la valeur moyenne est inférieure aux enregistrements envoyés par seconde pour la limite définie pour votre flux de données Kinesis. Pour plus d'informations sur les limites de partitions, consultez la section Quotas et limites Kinesis Data Streams.

Remarque : vous pouvez activer la fonction de surveillance améliorée pour vous assurer que la charge est répartie uniformément entre toutes vos partitions.

Vous pouvez également utiliser la métrique GetRecords.Records avec la statistique affichée sous la forme SampleCount et la période définie sur une minute. Divisez la valeur SampleCount par 60 secondes pour calculer le nombre moyen d'appels GetRecords effectués par seconde pour chaque partition. Si la valeur moyenne est d'environ cinq appels GetRecords par seconde et que vous recevez une erreur ReadProvisionedThroughputExceeded, vérifiez que vos applications consommateur ne dépassent pas les limites de partition. Si elles ne dépassent pas les limites de partition, l'erreur ReadProvisionedThroughputExceeded peut provenir du fait que vos consommateurs effectuent plus de cinq appels GetRecords/seconde.

Enfin, vérifiez s'il existe une disparité entre la valeur ReadProvisionedThroughputExceeded de vos partitions. Si la distribution des partitions est inégale ou si une partition reçoit plus ou moins de données que l'autre, il peut y avoir un déséquilibre de distribution. Pour résoudre ce déséquilibre de distribution des partitions et éviter les partitions à chaud, utilisez UUID comme clé de partition dans l'appel d'API putRecords.

Identifiez une éventuelle microrafale

Bien que rares, les valeurs des métriques peuvent être inférieures aux limites de partition, ce qui entraîne la limitation d'un flux de données Kinesis lors d'une lecture.

Par exemple, imaginons un scénario où GetRecords.Bytes Sum:1min représente 10 Mio de données lues pendant une minute. En une seconde, l'appel GetRecords.Bytes lit 2 Mio de données sans aucune limitation. Ensuite, à deux secondes, l'appel GetRecords.Bytes lit 8 Mio de données. À trois secondes, il peut n'y avoir aucune opération de lecture ou aucune limitation. Bien que la limite de partition pour la minute n'ait pas été atteinte (2 Mio*60 = 120 Mio de données), vous pouvez recevoir une erreur ReadProvisionedThroughputExceeded. Si vous remarquez un pic soudain dans les valeurs des métriques, recherchez la microrafale à l'origine de l'exception ReadProvisionedThroughputExceeded.

Suivez les bonnes pratiques en matière de flux de données

Pour atténuer les exceptions ReadProvisionedThroughputExceeded, appliquez les bonnes pratiques suivantes :

  • Reredimensionnez votre flux pour augmenter le nombre de partitions dans le flux.
  • Réduisez la taille des demandes GetRecords. Vous pouvez le faire en configurant le paramètre de limite ou en réduisant la fréquence des demandes GetRecords.
    Remarque : si le consommateur est Amazon Kinesis Data Firehose, le flux de données Kinesis s'ajuste à la fréquence des appels GetRecords qui sont effectués. Si l'application consommateur est une fonction AWS Lambda avec mappage de source d'événement, le flux est interrogé une fois par seconde. La fréquence d'interrogation ne peut pas être modifiée. Si le consommateur est une application de la bibliothèque client Amazon Kinesis (KCL), ajustez la fréquence d'interrogation en modifiant la valeur du paramètre DEFAULT_IDLETIME_BETWEEN_READS_MILLIS. Pour plus d'informations sur la modification de cette valeur dans la KCL, consultez Amazon Web Services - Labs sur le site web GitHub.
  • Répartissez les opérations de lecture et d'écriture aussi uniformément que possible entre toutes les partitions dans Data Streams.
  • Utilisez des applications consommateur avec la distribution améliorée. Pour plus d'informations sur la distribution améliorée, consultez, Développement d'applications consommateur personnalisées avec un débit dédié (distribution améliorée).
    Remarque : si votre flux de données Kinesis utilise plus de cinq consommateurs, une bonne pratique consiste à utiliser des consommateurs avec la distribution améliorée.
  • Utilisez une mécanisme de nouvelle tentative d'erreur et d'arrêt exponentiel dans la logique consommateur en cas d'exceptions ReadProvisionedThroughputExceeded. Pour les applications consommateur qui utilisent un kit AWS SDK, les demandes sont retentées par défaut.

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?