web-dev-qa-db-fra.com

Sujets, partitions et clés

Je cherche des éclaircissements sur le sujet. Dans les documentations Kafka j'ai trouvé ce qui suit:

Kafka fournit uniquement un ordre total sur les messages au sein d'une partition, pas entre les différentes partitions d'une rubrique. L'ordre par partition combiné à la possibilité de partitionner les données par clé est suffisant pour la plupart des applications. Cependant, si vous avez besoin d'un ordre total sur les messages, cela peut être réalisé avec un sujet qui n'a qu'une seule partition, bien que cela ne signifie qu'un seul processus consommateur par groupe de consommateurs.

Donc, voici mes questions:

  1. Est-ce que cela signifie que si je souhaite avoir plus d'un consommateur (du même groupe) lisant un sujet, j'ai besoin d'avoir plus d'une partition?

  2. Cela signifie-t-il que j'ai besoin de la même quantité de partitions que de la quantité de consommateurs pour le même groupe?

  3. Combien de consommateurs peuvent lire depuis une partition?

Vous avez également des questions concernant la relation entre les clés et les partitions en ce qui concerne l'API. Je n'ai regardé que les API .net (en particulier une de MS) mais ressemble à la mimique Java API. Je vois que lorsque vous utilisez un producteur pour envoyer un message à un sujet, il y a un paramètre clé. Mais lorsque le consommateur lit un sujet, il existe un numéro de partition.

  1. Comment les partitions sont-elles numérotées? À partir de 0 ou 1?
  2. Quelle relation exacte entre une clé et une partition? Si je comprends bien, certaines fonctions sur la clé détermineront une partition. Est-ce exact?
  3. Si j'ai 2 partitions dans une rubrique et que je veux que certains messages particuliers aillent à une partition et d'autres messages à une autre, devrais-je utiliser une clé spécifique pour une partition spécifique, et le reste pour une autre?
  4. Que faire si j'ai 3 partitions et un type de messages vers une partition particulière et le reste vers 2 autres?
  5. Comment en général j'envoie des messages à une partition particulière afin de savoir pour un consommateur d'où lire? Ou je ferais mieux avec plusieurs sujets?

Merci d'avance.

19
Igor K.

Igor,

Les partitions augmentent le parallélisme de Kafka topic. N'importe quel nombre de consommateurs/producteurs peuvent utiliser la même partition. C'est jusqu'à la couche d'application pour définir le protocole. Kafka garantit la livraison) . En ce qui concerne l'API, vous voudrez peut-être regarder les documents Java car ils peuvent être plus complets. D'après mon expérience:

  1. Les partitions commencent à 0
  2. Les clés peuvent être utilisées pour envoyer des messages à la même partition. Par exemple, hachage (clé)% num_partition. La logique est connectable au producteur. https://kafka.Apache.org/090/javadoc/index.html?org/Apache/kafka/clients/producer/Partitioner.html
  3. Oui. mais attention à ne pas vous retrouver avec une clé qui entraînera la partition "dédiée". Pour cela, vous voudrez peut-être avoir un sujet dédié. Par exemple, contrôler la rubrique et la rubrique de données
  4. Cela semble être la même question que 3.
  5. Je crois que les consommateurs ne devraient pas faire d'hypothèses sur les données basées sur la partition. L'approche typique consiste à avoir un groupe de consommateurs qui peut lire à partir de plusieurs partitions d'un sujet. Si vous souhaitez avoir des canaux dédiés, il est préférable (plus sûr/maintenable) d'utiliser des rubriques distinctes.
14
YaRiK

Est-ce que cela signifie que si je souhaite avoir plus d'un consommateur (du même groupe) lisant un sujet, j'ai besoin d'avoir plus d'une partition?

Voyons les propriétés suivantes de kafka:

  • chaque partition est consommée par exactement un consommateur du groupe
  • n consommateur du groupe peut consommer plusieurs partitions
  • le nombre de processus consommateurs dans un groupe doit être <= nombre de partitions

Avec ces propriétés, kafka est intelligemment capable de fournir à la fois ordering guarantees Et load balancing Sur un pool de processus grand public.

Pour répondre à votre question, oui, dans le cadre du même groupe, si vous voulez avoir N consumers, Vous devez avoir at least N partitions.

Cela signifie-t-il que j'ai besoin de la même quantité de partitions que de la quantité de consommateurs pour le même groupe?

Je pense que cela a été expliqué dans la première réponse.

Combien de consommateurs peuvent lire depuis une partition?

Le number of consumers Qui peut lire à partir d'une partition est toujours égal au number of consumer groups Abonné à ce sujet.

Relation entre les clés et les partitions en ce qui concerne l'API

Tout d'abord, nous devons comprendre que le producer est responsable du choix de l'enregistrement à affecter à quelle partition dans la rubrique.

Maintenant, voyons comment le producteur le fait. Tout d'abord, voyons la définition de classe de ProducerRecord.Java:

public class ProducerRecord<K, V> {

    private final String topic;
    private final Integer partition;
    private final Headers headers;
    private final K key;
    private final V value;
    private final Long timestamp;

}

Ici, le champ que nous devons comprendre de la classe est partition.

Depuis les documents,

  • Si un partition number Valide est spécifié, ce partition sera utilisé lors de l'envoi de l'enregistrement.
  • Si aucune partition n'est spécifiée mais qu'un key est présent, une partition sera choisie en utilisant un hash of the key.
  • Si ni key ni partition n'est présent, une partition sera affectée dans un round-robin fashion.
21
oblivion