Dans Apache Kafka, pourquoi n'y a-t-il pas plus d'instances de consommation que de cloisons?
j'apprends à propos de Kafka, en lisant la section introduction ici
https://kafka.apache.org/documentation.html#introduction
spécifiquement la partie sur les consommateurs. Dans l'avant dernier paragraphe de l'Introduction, il lit
Kafka le fait mieux. En ayant une notion de parallélisme-la partition-dans les sujets, Kafka est capable de fournir à la fois des garanties de commande et un équilibrage de charge sur un pool de la consommation de processus. Ce est atteint en assignant les partitions dans le thème aux consommateurs dans le groupe de consommateurs de sorte que chaque partition est consommée par exactement un consommateur dans le groupe. En faisant cela, nous nous assurons que l' le consommateur est le seul lecteur de la partition et consomme les données dans l'ordre. Comme il ya beaucoup de partitions ceci équilibre encore la charge sur de nombreux cas de consommation. Notez cependant qu'il ne peut être des consommateurs en cas de partition.
ma confusion provient de cette dernière phrase, parce que dans l'image juste au-dessus de ce paragraphe où l'auteur dépeint deux groupes de consommateurs et un sujet de 4 partitions, il y a plus d'instances de consommateurs que de partitions!
cela n'a pas non plus de sens qu'il ne peut pas y avoir plus d'instances de consommation que de partitions, parce que les partitions seraient alors incroyablement petites et il semble que le plafond dans la création d'une nouvelle partition pour chaque instance de consommation serait la tourbière de la baisse de Kafka. Je comprends que les partitions sont utilisées pour la tolérance aux erreurs et la réduction de la charge sur un serveur, mais la phrase ci-dessus n'a pas de sens dans le contexte d'un système distribué qui est censé être capable de gérer des milliers de consommateurs à la fois.
4 réponses
Ok, pour le comprendre, il faut comprendre plusieurs parties.
- afin de fournir une commande totale, le message ne peut être envoyé qu'à un seul consommateur. Sinon, il serait extrêmement inefficace, car il aurait besoin d'attendre que tous les consommateurs, pour recevoir le message avant d'envoyer la suivante:
cependant, bien que le serveur distribue des messages dans l'ordre, les messages sont livrés de façon asynchrone aux consommateurs, de sorte qu'ils peuvent arriver en panne sur différents consommateurs. Cela signifie effectivement que l'ordre des messages est perdu en présence d'une consommation parallèle. Les systèmes de messagerie contournent souvent cela en ayant une notion de "consommateur exclusif" qui permet à un seul processus de consommer à partir d'une file d'attente, mais bien sûr, cela signifie qu'il n'y a pas de parallélisme dans le traitement.
Kafka le fait mieux. En ayant une notion de parallélisme-la partition-dans les sujets, Kafka est en mesure de fournir à la fois l'ordre garanties et équilibrage de charge sur un ensemble de processus de consommation. Cela est réalisé en assignant les cloisons dans le sujet aux consommateurs dans le groupe de consommateurs de sorte que chaque cloison est consommée par exactement un consommateur dans le groupe. En faisant cela, nous nous assurons que le consommateur est le seul lecteur de la partition et consomme les données dans l'ordre. Comme il y a beaucoup de cloisons, cela équilibre encore la charge sur de nombreux cas de consommation. Notez cependant qu'il ne peut pas y avoir plus de cas de consommation que partitions.
Kafka fournit seulement un ordre total sur les messages à l'intérieur d'une partition, pas entre les différentes partitions d'un sujet.
aussi ce que vous pensez être une pénalité de performance (partitions multiples) est en fait un gain de performance, car Kafka peut effectuer des actions de différentes partitions complètement en parallèle, en attendant que d'autres partitions se terminent.
- l'image montre différents groupes de consommateurs, mais le limite d'un consommateur maximum par partition est seulement à l'intérieur d'un groupe. Vous pouvez toujours avoir plusieurs groupes de consommateurs.
au début, les deux scénarios sont décrits:
si tous les cas de consommation ont le même groupe de consommateurs, alors cela fonctionne tout comme une charge traditionnelle d'équilibrage de la file d'attente sur les consommateurs.
si toutes les instances de consommateurs ont des groupes de consommateurs différents, alors cela fonctionne comme publish-subscribe et tous les messages sont diffusés à tous les consommateurs.
ainsi, plus vous avez de groupes d'abonnés, Plus la performance est faible, car kafka doit répliquer les messages à tous ces groupes et garantir l'ordre total.
d'un autre côté, moins il y a de groupes et plus il y a de partitions, plus vous gagnez à paralyser le traitement des messages.
il est important de rappeler que Kafka garde un offset par [groupe de consommateurs, sujet, partition]. C'est la raison.
je suppose que la phrase
notez cependant qu'il ne peut pas y avoir plus de cas de consommation que de partitions.
se réfère au mode de" rééquilibrage automatique des groupes de consommateurs", le mode de consommation par défaut lorsque vous vous abonnez() à un certain nombre de consommateurs à une liste de sujets.
je suppose que parce que, à moins avec Kafka 0,9.x, rien n'empêche d'avoir plusieurs instances de consommation, membres du même groupe, lisant à partir de la même partition.
Vous pouvez faire quelque chose comme cela dans deux ou plusieurs fils différents
Properties props = new Properties();
props.put(ConsumerConfig.GROUP_ID_CONFIG, "MyConsumerGroup");
props.put("enable.auto.commit", "false");
consumer = new KafkaConsumer<>(props);
TopicPartition partition0 = new TopicPartition("mytopic", 0);
consumer.assign(Arrays.asList(partition0));
ConsumerRecords<Integer, String> records = consumer.poll(1000);
et vous aurez deux (ou plus) consommateurs lisant à partir de la même partition.
maintenant, le "problème" est que les deux consommateurs partageront le même offset, vous n'avez pas d'autre option puisqu'il n'y a qu'un groupe, un sujet et une partition en jouer.
si les deux consommateurs lisent l'offset courant en même temps, alors les deux liront la même valeur, et les deux recevront les mêmes messages.
si vous voulez que chaque consommateur lise des messages différents, vous devrez les synchroniser pour qu'un seul puisse récupérer et propager l'offset à la fois.
il y a une raison pour laquelle Kafka ne peut pas supporter plusieurs consommateurs par partition.
Kafka courtier écrit des données dans le fichier par partition. Par exemple, si deux partitions sont configurées, broker créera deux fichiers et assignera plusieurs groupes de consommateurs où les messages peuvent être envoyés.
maintenant, pour chaque partition, un seul consommateur consomme des messages basés sur l'offset du fichier. E. G le consommateur 1 Lira d'abord les messages du fichier offset 0 à 4096. Maintenant, ces compensées sont une partie de la charge utile afin que le consommateur sache quel offset utiliser lors de la demande pour les prochains messages lire.
si plusieurs consommateurs lisent à partir d'une même partition, alors le consommateur 1 lit à partir du fichier avec offset 0-4096, mais le consommateur 2 essaiera quand même de lire à partir de l'offset 0 à moins qu'il ne reçoive aussi un message envoyé au consommateur 1. Maintenant, si les mêmes messages sont envoyés à plusieurs consommateurs qu'il n'est pas un équilibrage de la charge donc Kafka les a divisés en groupes de consommateurs afin que tous les groupes de consommateurs peuvent recevoir messages mais au sein d'un groupe de consommateurs, un seul consommateur peut recevoir un message.
à Kafka, une seule instance de consommation peut consommer les messages d'une partition. Si les instances de consommateur sont plus que des partitions, alors il n'y aura pas d'utilisation d'instances de consommateur supplémentaires. Donc kafka ne permet pas ces cas de consommation supplémentaire.
maintenant, si plusieurs consommateurs peuvent consommer partition alors il n'y aurait pas d'ordre dans la consommation des messages. C'est la raison pour laquelle kafka ne permet pas plusieurs consommateurs par partition