J'ai fait une nouvelle installation d'Apache Kafka 0.10.1.0.
J'ai pu envoyer/recevoir des messages sur invite de commande.
Lors de l'utilisation de l'exemple Java producteur/consommateur, je ne suis pas en mesure de connaître le paramètre group.id / de l'exemple client.
Faites-moi savoir comment résoudre ce problème.
Ci-dessous, un exemple de consommation que j'avais utilisé:
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-topic");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
try {
consumer.subscribe(Arrays.asList("my-topic"));
ConsumerRecords<String, String> records = consumer.poll(100);
System.err.println("records size=>"+records.count());
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
catch (Exception ex){
ex.printStackTrace();
}
finally {
consumer.close();
}
}
Après avoir exécuté la commande pour le consommateur, je peux voir les messages (sur la console) postés par le producteur. Mais incapable de voir les messages du programme Java
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost: 9092 --topic my-topic --de début
Les consommateurs s’auto-étiquettent avec un nom de groupe de consommateurs et chaque enregistrement publié dans un sujet est remis à une instance de consommateur dans chaque groupe de consommateurs abonnés. Les instances de consommateur peuvent être séparées processus ou sur des machines séparées.
Si toutes les instances de consommateurs ont le même groupe de consommateurs, le fichier les enregistrements seront effectivement équilibrés sur les instances de consommateurs.
Si toutes les instances de consommateurs ont des groupes de consommateurs différents, alors chaque enregistrement sera diffusé à tous les processus consommateurs.
Le group.id est une chaîne qui identifie de manière unique le groupe de processus de consommateur auquel ce consommateur appartient.
( Kafka intro )
Donnez n'importe quelle valeur aléatoire à l'identifiant du groupe. Ça n'a pas d'importance.
props.put("group.id", "Any Random Value");
Dans le code que vous avez fourni, vous attendez juste une fois les données pendant 100 ms . Vous devriez les recevoir en boucle ou attendre plus longtemps (dans ce cas, vous ne recevrez qu'une partie des données) pour 'group.id' si vous utilisez Consumer depuis la console, il devient aléatoire 'group.id'.
Voici quelques résultats de test sur la partition et la propriété consommateur group.id
Properties props = new Properties();
//set all other properties as required
props.put("group.id", "ConsumerGroup1");
props.put("max.poll.records", "1");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
customer.group id sert à équilibrer la charge des données produites (si le group.id est différent pour chaque consommateur, chaque consommateur obtiendra la copie des données)
si partition = 1 et nombre total de consommateurs = 2, seul un consommateur actif sur deux obtiendra des données
si la partition = 2 et le nombre total de consommateurs = 2, chacun des deux consommateurs actifs reçoit également des données
si partition = 3 et le nombre total de consommateurs = 2, chacun des deux consommateurs actifs obtiendra des données. un consommateur obtient les données de 2 partitions et un autre obtient les données d'une partition.
si la partition = 3 et le nombre total de consommateurs = 3, chacun des trois consommateurs actifs obtient des données de manière égale.
Comme aucun décalage n'a été fourni, le client Java attendra les nouveaux messages, mais n’affichera pas les messages existants. Si on veut lire tous les messages déjà dans le sujet, on peut utiliser ce morceau de code:
if (READ_FROM_BEGINNING) {
//consume all the messages from the topic from the beginning.
//this doesn't work reliably if it consumer.poll(..) is not called first
//probably because of lazy-loading issues
consumer.poll(10);
consumer.seekToBeginning(consumer.assignment()); //if intending to
//read from the beginning or call below to read from a predefined offset.
//consumer.seek(consumer.assignment().iterator().next(), READ_FROM_OFFSET);
}