web-dev-qa-db-fra.com

Flux Akka Kafka vs Kafka Streams

Je travaille actuellement avec Akka Stream Kafka pour interagir avec kafka) et je me demandais quelles étaient les différences avec Kafka Streams .

Je sais que l'approche basée sur Akka implémente les spécifications réactives et gère la contre-pression, fonctionnalité qui kafka) semble faire défaut.

Quel serait l’avantage d’utiliser kafka) au-dessus des courants akka kafka?

34
nsanglar

Votre question est très générale, je vais donc donner une réponse générale de mon point de vue.

Premièrement, j'ai deux scénarios d'utilisation:

  1. les cas où je lis des données de kafka, les traite et enregistre certaines sorties sur kafka, pour celles-ci, j'utilise exclusivement des jets kafka.
  2. les cas où la source de données ou le puits n'est pas kafka, pour ceux que j'utilise des flux akka.

Cela me permet déjà de répondre à la partie concernant la contre-pression: pour le premier scénario ci-dessus, il existe un mécanisme de contre-pression dans kafka stream.

Concentrons-nous maintenant sur le premier scénario décrit ci-dessus. Voyons ce que je perdrais si je décidais de ne plus utiliser Kafka stream:

  • certaines étapes de mes processeurs de flux ont besoin d'un magasin d'état persistant (distribué), kafka est fourni par les flux pour moi. C'est quelque chose que les flux akka ne fournissent pas.
  • scaling, kafka stream équilibre automatiquement la charge dès qu'une nouvelle instance d'un processeur de flux est démarrée, ou dès qu'une personne est tuée. Cela fonctionne dans la même machine nœuds: mise à l’échelle et dehors Ceci n’est pas fourni par les flux akka.

Ce sont les plus grandes différences qui comptent pour moi, j'espère que cela vous semblera logique!

36
Frederic A.

Le grand avantage d’Akka Stream sur Kafka Les flux serait la possibilité d’implémenter des graphiques de traitement très complexes pouvant être cycliques avec un ventilateur d’entrée/sortie et une boucle de retour. Kafka = stream n'autorise le graphe acyclique que si je ne me trompe pas. Il serait très compliqué d'implémenter un graphe de traitement cyclique au-dessus de Kafka streams

3
vgkowski

Trouvé cet article pour donner un bon résumé des préoccupations de conception distribuées que Kafka Streams fournit (complète Akka Streams).

https://www.beyondthelines.net/computing/kafka-streams/

Classement des messages : Kafka maintient une sorte de journal d'ajout uniquement où il stocke tous les messages. Chaque message a une séquence. id également connu sous le nom de offset.Le décalage est utilisé pour indiquer la position d'un message dans le journal. Kafka stream utilise ces décalages de message pour maintenir l'ordre.

partitionnement : Kafka divise un sujet en partitions et chaque partition est répliquée entre différents courtiers. Le partitionnement permet de le chargement et la réplication rendent l'application tolérante aux pannes (si un courtier est en panne, les données sont toujours disponibles). C'est bon pour le partitionnement des données, mais nous devons également répartir les processus de la même manière. Kafka Streams utilise la topologie du processeur qui s'appuie sur la gestion de groupe Kafka). Il s'agit de la même gestion de groupe utilisée par le consommateur Kafka pour répartir la charge uniformément entre les courtiers ( Ce travail est principalement géré par les courtiers).

Tolérance aux pannes : la réplication des données garantit la tolérance aux pannes des données. La gestion des groupes intègre une tolérance aux pannes dans la mesure où elle redistribue la charge de travail entre les instances de courtier actif restantes.

Gestion des états : Kafka les flux fournissent un stockage local sauvegardé par un kafka rubrique change-log qui utilise le compactage du journal (conserve uniquement la valeur la plus récente pour une clé donnée). Compaction du journal Kafka

Retraitement : lors du démarrage d'une nouvelle version de l'application, nous pouvons retraiter les journaux à partir du début pour calculer le nouvel état, puis rediriger le trafic vers la nouvelle instance et arrêter ancienne application.

Gestion du temps : "Les données de flux ne sont jamais complètes et peuvent toujours arriver en panne", il faut donc distinguer le temps de l'événement par rapport au temps traité et le gérer. correctement.

L'auteur indique également "À l'aide de cette rubrique du journal des modifications Kafka, Stream peut gérer une" vue de tableau "de l'état de l'application."

Mon opinion est que cela s'applique principalement à une application d'entreprise où "l'état de l'application" est ... petit.

Pour une application de science des données fonctionnant avec des "données volumineuses", l '"état d'application" produit par une combinaison de données combinées, de modèles d'apprentissage automatique et de logique métier pour orchestrer tout cela ne sera probablement pas bien géré avec Kafka Streams.

Je pense aussi que l’utilisation d’un "runtime de sourcing d’événements fonctionnels purs" comme https://github.com/notxcain/aecor = contribuera à rendre les mutations explicites et à séparer la logique de l'application de la technologie utilisée pour gérer la forme persistante de l'état par le biais de la gestion de la mutation d'état par principe et IO "effets" (programmation fonctionnelle).

En d'autres termes, la logique métier ne s'embrouille pas avec Kafka apis.

2
SemanticBeeng