Comment assurer la synchronisation des transactions kafka entre un producteur et l'application des consommateurs séparément, en ce qui concerne les points de défaillance?

R. Lazaro:

Je suis encore un peu nouveau pour printemps-Kafka / Kafka en général. Ma question est assez brève. J'ai un seul consommateur application qui lit de Kafka sans cesse, des messages traite, et les reconnaît manuellement à l'aide d' un Ack Listener. Je les dépendances d'un amont producteur seule application dans laquelle ils sont ceux en charge d'envoyer des messages aux sujets Kafka pour moi de consommer. Nous avons récemment les transactions mises en œuvre dans le producteur et le consommateur , mais je voulais comprendre plus sur les points de défaillance et de la façon de traiter ces transactions sont annulées de sorte qu'ils ne sont pas perdus? J'ai lu qu'il est préférable d'utiliser au AfterRollbackProcessorlieu de SeekToCurrentErrorHandlerpour les transactions sur l'usine de conteneurs de kafka, ainsi que d' StatefulRetryêtre mis à vrai. la raison pour laquelle je me sers des transactions est de réaliser la sémantique exactement-Kafka une fois dans leur version plus récente parce que nous traitons avec beaucoup de persévérance et de base de données ne peut pas se permettre des transactions en double en raison de contraintes DB. Je me demandais si ma @KafkaListenerdevait être annotée avec @Transactionalparce que j'avais lu un message avant de déclarer que cela ne devrait pas être le cas , mais d' autres postes que cela pourrait être le cas qui est la raison pour laquelle je ne suis pas sûr. J'ai vu beaucoup de questions sur un producteur et l' application consommateur mais je ne l' ai pas vu une au sujet des applications distinctes avec ces rôles distincts respectivement (même si elle pourrait être la même chose à la fin de la journée). En un mot, je voulais juste savoir quelles sont les meilleures pratiques lors de l' intégration des transactions avec Kafka et comment gérer les défaillances dans ce cas.

Gary Russell:

Kafka transactions sont une surcharge inutile pour les applications grand public uniquement. Les transactions ne sont utiles que lors de la production des documents.

J'utilise des transactions est de réaliser les exactement une fois- sémantique Kafka dans leur version plus récente parce que nous traitons avec beaucoup de persévérance et de base de données peut pas se permettre des transactions en double en raison de contraintes DB.

Il n'y a aucune garantie pour « exactement une fois » lorsque d' autres technologies sont impliquées. Applique exactement une seule fois à

read->process->write

scénarios où lire et à écrire sont Kafka . Ceci est un malentendu commun.

En outre, même avec kafka seule lecture / processus / écriture, le « exactement une fois » la sémantique s'appliquent au tralala uniquement. à savoir, le décalage de la lecture est uniquement engagée si l'écriture est réussie.

L' processétape se au moins une fois la sémantique si vous avez besoin de déduplication logique chaque fois que vous écrivez ailleurs dans l'étape de processus, indépendamment du fait que il y a une étape d'écriture Kafka et (s'il y a une écriture Kafka) que vous utilisez des transactions pour une seule fois Là.

Pour les cas où vous lisez de Kafka et d' écriture sur un DB, sans écrire à Kafka, @Transactionall'auditeur est la bonne approche (avec la logique de-dup pour éviter les doublons).

Pour les cas où vous voulez exactement une fois la sémantique Kafka (lecture / processus / écriture) , mais aussi écrire à un DB dans l'étape de processus, vous pouvez utiliser un ChainedKafkaTransactionManagerdans le conteneur d'écoute de sorte que la transaction DB est synchronisée avec la transaction Kafka (mais il y a encore une petite fenêtre pour les cas où la DB réussit commit, mais la transaction échoue Kafka). Donc , vous avez encore besoin de logique-dup, même alors. Dans ce cas, vous ne voulez @Transactionalsur l'auditeur.

ÉDITER

Le producteur seulement est un autre bit; Disons que vous souhaitez publier 10 enregistrements dans une transaction, vous voulez tous être (commis) ou sur (dos laminé). Vous devez utiliser des transactions alors.

Les consommateurs des documents produits dans les transactions doivent avoir isolation.level=read_committedafin qu'ils ne voient pas ( par défaut écriture non validée est read_uncommitted).

Si vous publiez uniquement des enregistrements uniques à la fois, et il n'y a pas d'autre ressource transactionnelle en cause, il y a peu d'intérêt à l'utilisation des transactions si seulement Kafka est impliqué.

Si, cependant, vous lisez à partir d'une base de données, ou JMS, etc., et écrit à Kafka, vous voulez probablement synchroniser les transactions DB et Kafka, mais, encore une fois, la probabilité de doublons est toujours non nul; la façon dont vous traitez avec qui dépend de l'ordre dans lequel vous vous engagez les transactions.

En règle générale, de déduplication dépend de l'application; souvent une clé dans les données d'application est utilisée ainsi, par exemple, une instruction SQL INSERT est subordonnée à cette clé ne sont pas déjà existant dans la base de données.

Kafka fournit une clé unique pratique pour chaque enregistrement, avec la combinaison de sujet / partition / offset. Vous pouvez stocker ces données dans la base de données ainsi que les données pour éviter les doublons.

EDIT2

SeekToCurrentErrorHandler(STCEH) est généralement utilisé lorsque vous n'utilisez les transactions; lorsque l'auditeur émet une exception, le gestionnaire d'erreurs remet à zéro les décalages de sorte que le dossier est refetched sur le prochain scrutin. Après un certain nombre de tentatives, nous abandonnons et appeler un « recoverer », comme le DeadLetterPublishingRecovererpour écrire l'enregistrement a échoué à un autre sujet.

Il peut encore être utilisé avec les transactions, cependant.

Le gestionnaire d'erreurs est appelé dans le cadre de la transaction ( avant l'annulation) ainsi, si elle lance une exception ( ce qui fait que si les « consume » récupérateur l'échec), la transaction sera toujours en arrière du rouleau. Si la reprise est réussie, la transaction engage.

Le AfterRollbackProcessor(ARP) a été ajouté avant la capacité de récupération a été ajouté à la STCEH. Il fait essentiellement exactement le même que le STCEH, mais il fonctionne en dehors du champ d' application de l'opération ( après l'annulation).

Configuration à la fois ne sera pas quelque chose de mal, car il n'y aura rien pour l'ARP faire si le STCEH a déjà effectué la cherche.

Je préfère encore utiliser l'ARP avec des transactions et STCEH sans - si seulement pour obtenir les catégories de journaux appropriés pour les messages du journal. Il peut y avoir d'autres raisons que je ne peux pas penser en ce moment.

Notez que, maintenant que nouvelle tentative et back-off est pris en charge à la fois la STCEH et ARP, il n'y a pas besoin de configurer niveau d'écoute nouvelle tentative stateful du tout. Stateless nouvelle tentative pourrait encore être utile si vous souhaitez utiliser en mémoire retries sans faire des allers-retours au courtier pour récupérer à nouveau le même disque (s).

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=363767&siteId=1
conseillé
Classement