Comment minimiser la latence impliquée dans le cadre de messagerie kafka?

Scénario: j'ai un faible volume de thème (~150msgs/sec) pour lesquelles nous aimerions avoir un faible délai de propagation du producteur au consommateur.

j'ai ajouté un horodatage d'un producteur et je l'ai lu chez consumer pour enregistrer le délai de propagation, avec des configurations par défaut le msg (de 20 octets) a montré un délai de propagation de 1960ms à 1230ms. Aucun retard de réseau n'est impliqué puisque, j'ai essayé sur un 1 producteur et 1 simple consommateur sur la même machine.

Lorsque I ont essayé d'ajuster l'intervalle de flush de sujet à 20ms, il baisse à 1100ms à 980ms. Puis j'ai essayé d'ajuster les consommateurs "fetcher.backoff.ms" à 10ms, il est tombé à 1070ms-860ms.

Problème: pour 20 octets d'un msg, j'aimerais avoir un délai de propagation aussi bas que possible et ~950ms est un chiffre plus élevé.

Question: Rien de ce que je suis absent dans la configuration? Je ne volontiers les commentaires, le retard avec lequel vous avez obtenu à minimum.

Hypothèse: le système Kafka implique l'entrée/sortie du disque avant que le consommateur obtienne le msg du producteur et cela va avec le régime du disque dur et ainsi de suite..


mise à Jour: Essayé de régler le Vidage Du Journal Politique pour la durabilité et la latence.

Voici la configuration:
# The number of messages to accept before forcing a flush of data to disk
log.flush.interval=10
# The maximum amount of time a message can sit in a log before we force a flush
log.default.flush.interval.ms=100
# The interval (in ms) at which logs are checked to see if they need to be 
# flushed to disk.
log.default.flush.scheduler.interval.ms=100

pour le même msg de 20 octets, le délai était de 740ms-880ms.

Les déclarations suivantes sont apportées clair dans la configuration elle-même.

Il y a quelques grands arbitrages:

  1. Durabilité: les données non filtrées sont plus à risque de perte en cas de crash.

  2. Latence: les données ne sont pas mises à la disposition des consommateurs tant qu'elles ne sont pas effacées (ce qui ajoute de la latence).

  3. Débit: La chasse d'eau est généralement le plus cher opération.

donc, je crois qu'il n'y a aucun moyen de descendre à une note de 150m - 250m. (sans mise à niveau matérielle) .

23
demandé sur Amol M Kulkarni 2013-12-11 17:30:32

4 réponses

je n'essaie pas d'esquiver la question, mais je pense que kafka est un mauvais choix pour ce cas d'utilisation. Bien que je pense que Kafka est grande (j'ai été un énorme promoteur de son utilisation sur mon lieu de travail), sa force n'est pas faible latence. Ses points forts sont le rendement élevé des producteurs et le soutien à la fois pour les consommateurs rapides et lents. Bien qu'il offre une durabilité et une tolérance aux défauts, il en va de même pour les systèmes à usage général comme rabbitMQ. RabbitMQ prend également en charge divers clients, dont node.js. Où rabbitMQ n'est pas à la hauteur par rapport à kafka is lorsqu'il s'agit de volumes extrêmement élevés (disons 150K msg/s). À ce moment-là, L'approche de lapin à la durabilité commence à tomber en morceaux et Kafka se démarque vraiment. La durabilité et les capacités de tolérance de défaut de lapin sont plus que capables à 20K msg / s (dans mon expérience).

de plus, pour obtenir un tel débit, Kafka traite les messages par lots. Alors que les lots sont petits et leur taille est configurable, vous ne pouvez pas les rendre trop petit sans trop de frais généraux. Malheureusement, le batching de message rend la faible latence très difficile. Alors que vous pouvez régler divers paramètres dans kafka, Je ne voudrais pas utiliser Kafka pour quoi que ce soit où la latence devait être uniformément moins de 1-2 secondes.

en outre, kafka 0.7.2 n'est pas un bon choix si vous lancez une nouvelle application. Tout l'accent est sur 0.8 maintenant donc vous serez sur votre propre si vous rencontrez des problèmes et je ne m'attendrais certainement pas à une nouvelle caractéristique.

encore une fois, je pense que Kafka est génial pour certains cas très spécifiques, bien que populaires, d'utilisation. Sur mon lieu de travail, on utilise du lapin et du Kafka. Bien que cela puisse sembler gratuit, ils sont vraiment flatteurs.

30
répondu Paul M 2013-12-14 16:26:56

je sais que cela fait plus d'un an que cette question a été posée, mais je viens de construire un cluster Kafka pour les besoins du dev, et nous voyons moins de 1ms de latence du producteur au consommateur. Mon cluster se compose de trois noeuds VM tournant sur un service de vm cloud (Skytap) avec stockage SAN, il est donc loin d'être idéal. J'utilise Kafka 0.9.0.0, ce qui est assez nouveau pour que je sois sûr que l'asker utilisait quelque chose de plus ancien. Je n'ai aucune expérience avec les versions plus anciennes, donc vous pourriez obtenir cette augmentation de performance simplement d'une mise à jour.

je mesure la latence en exécutant un producteur et consommateur Java que j'ai écrit. Les deux fonctionnent sur la même machine, sur une quatrième VM dans le même environnement Skytap (pour minimiser la latence réseau). Le producteur enregistre l'heure actuelle (System.nanoTime()), utilise cette valeur comme charge utile dans un message Avro, et envoie (acks=1). Le consommateur est configuré pour Poller en continu avec un timeout de 1ms. Lorsqu'il reçoit un lot de messages, il enregistre l'heure actuelle (System.nanoTime() nouveau), puis soustrait le temps de réception du temps d'envoi pour calculer la latence. Quand il a 100 messages, il calcule la moyenne des 100 latences et imprime à stdout. Notez qu'il est important d'exécuter le producteur et le consommateur sur la même machine pour qu'il n'y ait pas de problème de synchronisation avec le calcul de la latence.

j'ai beaucoup joué avec le volume de messages générés par le producteur. Il ya certainement un point où il ya trop et la latence commence à augmenter, mais il est nettement supérieur à 150 / sec. Il faut parfois jusqu'à 20m pour transmettre un message, mais la grande majorité des messages durent entre 0,5 ms et 1,5 ms.

tout cela a été réalisé avec les configurations par défaut de Kafka 0.9. Je n'avais pas à faire un peaufinage. J'ai utilisé la taille du lot=1 pour mes tests initiaux, mais j'ai constaté plus tard qu'elle n'avait aucun effet à faible volume et imposait une limite significative au volume de pointe avant que les latences commencent à augmenter.

Il est important de noter que lorsque J'exécute mon producteur et mon consommateur sur ma machine locale, la même configuration signale des latences de message dans la gamme 100ms -- les mêmes latences rapportées si je ping simplement mes courtiers Kafka.

je vais éditer ce message plus tard avec le code échantillon de mon producteur et le consommateur avec d'autres détails, mais je voulais poster quelque chose avant que j'oublie.

11
répondu JakeRobb 2016-01-25 14:46:20

les versions modernes de Kafka semblent avoir une latence assez minime comme les résultats de ici afficher:

2 ms (médiane) 3 ms (99e percentile) 14 ms (99,9 e percentile)

4
répondu Ravi 2016-01-28 20:11:11

Kafka peut atteindre une latence d'environ milliseconde, en utilisant la messagerie synchrone. Avec la messagerie synchrone, le producteur ne collecte pas les messages dans un patch avant l'envoi.

bin/kafka-console-producer.sh --broker-list my_broker_host:9092 --topic test --sync

La suite a le même effet:

--batch-size 1 
3
répondu Jack 2015-05-21 05:47:55