J'ai une liste de sujets (pour l'instant c'est 10) dont la taille peut augmenter à l'avenir. Je sais que nous pouvons générer plusieurs threads (par sujet) à consommer pour chaque sujet, mais dans mon cas, si le nombre de sujets augmente, le nombre de threads consommant à partir des sujets augmente, ce que je ne veux pas, car les sujets ne sont pas va obtenir des données trop fréquemment, de sorte que les discussions seront idéales.
Existe-t-il un moyen d'avoir un seul consommateur à consommer sur tous les sujets? Si oui, comment pouvons-nous y parvenir? De plus, comment la compensation sera-t-elle maintenue par Kafka? Veuillez suggérer des réponses.
Nous pouvons souscrire à plusieurs rubriques à l'aide de l'API suivante: consumer.subscribe (Arrays.asList (topic1, topic2), ConsumerRebalanceListener obj)
Le consommateur a les informations sur le sujet et nous pouvons commiter en utilisant consumer.commitAsync ou consumer.commitSync () en créant un objet OffsetAndMetadata comme suit.
ConsumerRecords<String, String> records = consumer.poll(long value);
for (TopicPartition partition : records.partitions()) {
List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
for (ConsumerRecord<String, String> record : partitionRecords) {
System.out.println(record.offset() + ": " + record.value());
}
long lastOffset = partitionRecords.get(partitionRecords.size() - 1).offset();
consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)));
}
Il n'y a pas besoin de plusieurs threads, vous pouvez avoir un consommateur, consommant de plusieurs sujets. Les compensations sont gérées par zookeeper, car le serveur kafka lui-même est sans état. Chaque fois qu'un consommateur consomme un message, son décalage est validé avec zookeeper pour garder une trace future afin de traiter chaque message une seule fois. Ainsi, même en cas d'échec de kafka, le consommateur commencera à consommer à partir de l'avant-dernier décalage engagé.