Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Bonnes pratiques pour les clients Apache Kafka
Lorsque vous travaillez avec Apache Kafka et Amazon MSK, il est important de configurer correctement le client et le serveur pour des performances et une fiabilité optimales. Ce guide fournit des recommandations sur les meilleures pratiques en matière de configuration côté client pour Amazon MSK.
Pour plus d'informations sur les meilleures pratiques d'Amazon MSK Replicator, consultez. Bonnes pratiques pour l'utilisation du réplicateur MSK Pour connaître les meilleures pratiques des courtiers Standard et Express, consultezMeilleures pratiques pour les courtiers Standard et Express.
Rubriques
Disponibilité du client Apache Kafka
Dans un système distribué tel qu'Apache Kafka, il est essentiel de garantir une haute disponibilité pour maintenir une infrastructure de messagerie fiable et tolérante aux pannes. Les courtiers se déconnecteront en cas d'événements planifiés et imprévus, tels que les mises à niveau, les correctifs, les pannes matérielles et les problèmes de réseau. Un cluster Kafka tolère un courtier hors ligne. Par conséquent, les clients de Kafka doivent également gérer le basculement des courtiers avec élégance. Pour garantir la haute disponibilité des clients de Kafka, nous recommandons ces meilleures pratiques.
Disponibilité des producteurs
retriesParamétré pour demander au producteur de réessayer d'envoyer les messages d'échec lors du basculement du broker. Nous recommandons une valeur entière maximale ou une valeur élevée similaire pour la plupart des cas d'utilisation. Si vous ne le faites pas, la haute disponibilité de Kafka sera interrompue.delivery.timeout.msDéfini pour spécifier la limite supérieure du temps total entre l'envoi d'un message et la réception d'un accusé de réception du courtier. Cela doit refléter les exigences commerciales relatives à la durée de validité d'un message. Définissez une limite de temps suffisamment élevée pour permettre un nombre suffisant de tentatives pour terminer l'opération de basculement. Nous recommandons une valeur de 60 secondes ou plus pour la plupart des cas d'utilisation.request.timeout.msRéglé au maximum, une seule demande doit attendre avant de tenter un renvoi. Nous recommandons une valeur de 10 secondes ou plus pour la plupart des cas d'utilisation.Configurez le délai entre les nouvelles tentatives afin d'éviter les tempêtes de nouvelles tentatives et l'impact sur la disponibilité.
retry.backoff.msNous recommandons une valeur minimale de 200 ms pour la plupart des cas d'utilisation.acks=allParamétré pour configurer une durabilité élevée ; cela doit être conforme à une configuration côté serveur deRF=3etmin.isr=2garantir que toutes les partitions de l'ISR accusent réception de l'écriture. Lors d'un seul courtier hors ligne, c'est lemin.isr, c'est-à-dire2.
Disponibilité pour les consommateurs
Défini
auto.offset.resetsurlatestinitialement pour les groupes de consommateurs nouveaux ou recréés. Cela évite le risque d'alourdir la charge du cluster en consommant l'intégralité du sujet.Régler
auto.commit.interval.mslors de l'utilisationenable.auto.commit. Nous recommandons une valeur minimale de 5 secondes pour la plupart des cas d'utilisation afin d'éviter le risque de charge supplémentaire.Mettez en œuvre la gestion des exceptions dans le code de traitement des messages du client afin de gérer les erreurs transitoires, par exemple un disjoncteur ou une mise en veille avec arrêt exponentiel. Si vous ne le faites pas, vous risquez de bloquer l'application, ce qui peut entraîner un rééquilibrage excessif.
isolation.levelParamétré pour contrôler le mode de lecture des messages transactionnels :Nous recommandons de toujours définir
read_uncommittedimplicitement par défaut. Cela est absent de certaines implémentations clientes.Nous recommandons une valeur égale à
read_uncommittedlorsque vous utilisez le stockage hiérarchisé.Configurez
client.rackpour utiliser la réplique lue la plus proche. Nous vous recommandons de régler sur leaz idafin de minimiser les coûts du trafic réseau et la latence. Consultez Réduisez les coûts liés au trafic réseau de vos clients Amazon MSK grâce à la prise en compte des racks.
Rééquilibres de consommation
session.timeout.msDéfini sur une valeur supérieure au temps de démarrage d'une application, y compris toute instabilité de démarrage mise en œuvre. Nous recommandons une valeur de 60 secondes pour la plupart des cas d'utilisation.Défini
heartbeat.interval.mspour affiner la façon dont le coordinateur du groupe perçoit un consommateur comme étant en bonne santé. Nous recommandons une valeur de 10 secondes pour la plupart des cas d'utilisation.Définissez un crochet d'arrêt dans votre application pour fermer proprement le client sur SIGTERM, plutôt que de vous fier aux délais d'expiration de session pour identifier le moment où un consommateur quitte un groupe. Les applications Kstream peuvent être définies
internal.leave.group.on.closesur une valeur de.truegroup.instance.idDéfini sur une valeur distincte au sein du groupe de consommateurs. Idéalement, un nom d'hôte, un identifiant de tâche ou un identifiant de domaine. Nous vous recommandons de toujours définir ce paramètre pour des comportements plus déterministes et une meilleure corrélation des client/server logs lors du dépannage.Définissez
group.initial.rebalance.delay.msune valeur correspondant à une durée de déploiement moyenne. Cela met fin aux rééquilibres continus pendant le déploiement.partition.assignment.strategyParamétré pour utiliser des assignateurs permanents. Nous recommandons l'unStickyAssignorou l'autreCooperativeStickyAssignor.
Performances du client Apache Kafka
Pour garantir des performances élevées aux clients de Kafka, nous recommandons ces meilleures pratiques.
Performance du producteur
linger.msParamétré pour contrôler le temps pendant lequel un producteur attend le remplissage d'un lot. Les petits lots sont coûteux en termes de calcul pour Kafka, car ils se traduisent par un plus grand nombre de threads et I/O d'opérations à la fois. Nous recommandons les valeurs suivantes.Une valeur minimale de 5 ms pour tous les cas d'utilisation, y compris une faible latence.
Nous recommandons une valeur supérieure de 25 ms, dans la plupart des cas d'utilisation.
Nous vous recommandons de ne jamais utiliser une valeur de zéro dans les cas d'utilisation à faible latence. (Une valeur de zéro entraîne généralement une latence, indépendamment de la surcharge d'E/S).
batch.sizeParamétré pour contrôler la taille du lot envoyé au cluster. Nous vous recommandons d'augmenter cette valeur à 64 Ko ou 128 Ko.Défini
buffer.memorylorsque vous utilisez des lots de plus grande taille. Nous recommandons une valeur de 64 Mo pour la plupart des cas d'utilisation.send.buffer.bytesDéfini pour contrôler le tampon TCP utilisé pour recevoir des octets. Nous recommandons une valeur de -1 pour permettre au système d'exploitation de gérer cette mémoire tampon lors de l'exécution d'un producteur sur un réseau à latence élevée.Définissez compression.type pour contrôler la compression des lots. Nous recommandons que lz4 ou zstd exécutent un producteur sur un réseau à latence élevée.
Performance du consommateur
Défini
fetch.min.bytespour contrôler la taille d'extraction minimale qui doit être valide afin de réduire le nombre de récupérations et la charge du cluster.Nous recommandons une valeur minimale de 32 octets pour tous les cas d'utilisation.
Nous recommandons une valeur supérieure de 128 octets pour la plupart des cas d'utilisation.
Définissez fetch.max.wait.ms pour déterminer combien de temps votre consommateur attendra avant que fetch.min.bytes ne soit ignoré. Nous recommandons une valeur de 1 000 ms pour la plupart des cas d'utilisation.
Nous recommandons que le nombre de consommateurs soit au moins égal au nombre de partitions pour un meilleur parallélisme et une meilleure résilience. Dans certains cas, vous pouvez choisir d'avoir moins de consommateurs que le nombre de partitions pour les sujets à faible débit.
receive.buffer.bytesDéfini pour contrôler le tampon TCP utilisé pour recevoir des octets. Nous recommandons une valeur de -1 pour permettre au système d'exploitation de gérer cette mémoire tampon lors de l'exécution d'un client sur un réseau à latence élevée.
Connexions client
Le cycle de vie des connexions a un coût de calcul et de mémoire sur un cluster Kafka. Un trop grand nombre de connexions créées simultanément entraîne une charge susceptible d'avoir un impact sur la disponibilité d'un cluster Kafka. Cet impact sur la disponibilité peut souvent amener les applications à créer encore plus de connexions, provoquant ainsi une panne en cascade, entraînant une panne complète. Un nombre élevé de connexions peut être atteint lorsqu'elles sont créées à un rythme raisonnable.
Nous recommandons les mesures d'atténuation suivantes pour gérer les taux élevés de création de connexions :
Assurez-vous que le mécanisme de déploiement de votre application ne redémarre pas producers/consumers en une seule fois, mais de préférence par petits lots.
Au niveau de la couche application, le développeur doit s'assurer qu'une instabilité aléatoire (veille aléatoire) est effectuée avant de créer un client administrateur, un client producteur ou un client consommateur.
Chez SIGTERM, lors de la fermeture de la connexion, une mise en veille aléatoire doit être exécutée pour s'assurer que tous les clients Kafka ne sont pas fermés en même temps. Le sommeil aléatoire doit se situer dans le délai imparti avant que SIGKILL ne se produise.
Exemple Exemple A (Java)
sleepInSeconds(randomNumberBetweenOneAndX); this.kafkaProducer = new KafkaProducer<>(this.props);Exemple Exemple B (Java)
Runtime.getRuntime().addShutdownHook(new Thread(() -> { sleepInSeconds(randomNumberBetweenOneAndTwentyFive); kafkaProducer.close(Duration.ofSeconds(5)); });Au niveau de la couche application, le développeur doit s'assurer que les clients ne sont créés qu'une seule fois par application selon un modèle singleton. Par exemple, lors de l'utilisation de lambda, le client doit être créé dans une portée globale, et non dans le gestionnaire de méthodes.
Nous recommandons que le nombre de connexions soit surveillé dans le but d'être stable. creation/close/shiftLa connexion est normale pendant les déploiements et le basculement du broker.
Surveillance des clients Kafka
La surveillance des clients Kafka est essentielle pour maintenir la santé et l'efficacité de votre écosystème Kafka. Que vous soyez administrateur, développeur ou membre de l'équipe opérationnelle de Kafka, l'activation des métriques côté client est essentielle pour comprendre l'impact commercial lors d'événements planifiés et imprévus.
Nous vous recommandons de surveiller les mesures côté client suivantes à l'aide de votre mécanisme de capture de mesures préféré.
Lorsque vous créez des tickets d'assistance auprès de AWS, incluez toutes les valeurs anormales observées lors de l'incident. Incluez également un échantillon des journaux de l'application cliente détaillant les erreurs (et non les avertissements).
Indicateurs relatifs aux producteurs
débit d'octets
record-send-rate
records-per-request-avg
acks-latency-avg
request-latency-avg
request-latency-max
record-error-rate
record-retry-rate
taux d'erreur
Note
Les erreurs transitoires lors de nouvelles tentatives ne sont pas préoccupantes, car cela fait partie du protocole de Kafka pour gérer les problèmes transitoires tels que le basculement du leader ou les retransmissions réseau. record-send-rateconfirmera si les producteurs procèdent toujours à de nouvelles tentatives.
Indicateurs de consommation
records-consumed-rate
bytes-consumed-rate
taux de récupération
records-lag-max
record-error-rate
fetch-error-rate
taux de vote
rebalance-latency-avg
taux d'engagement
Note
Des taux d'extraction et de validation élevés entraîneront une charge inutile sur le cluster. Il est optimal d'exécuter des demandes en lots plus importants.
Métriques communes
connection-close-rate
connection-creation-rate
nombre de connexions
Note
Une connexion élevée creation/termination entraînera une charge inutile sur le cluster.