Lors de l'interrogation de Kafka, j'ai souscrit à plusieurs sujets à l'aide de la fonction subscribe()
. Maintenant, je veux définir le décalage à partir duquel je veux lire chaque sujet, sans avoir à vous réabonner après chaque seek()
et poll()
à partir d'un sujet. Si vous appelez seek()
de manière itérative sur chacun des noms de sujet, avant de rechercher des données obtenez le résultat?
J'ai une partition par sujet et un seul consommateur à lire de tous les sujets.
Comment Kafka stocke-t-il des décalages pour chaque sujet?
Kafka a déplacé la mémoire offset des gardiens de zoo au courtier kafka. La raison est ci-dessous:
Zookeeper n'est pas un bon moyen de gérer une charge en écriture élevée telle que les mises à jour d'offset, car zookeeper route chaque écriture à travers chaque nœud et n'a donc aucune possibilité de partitionner ou de redimensionner les écritures. Nous avons toujours su cela, mais avons choisi cette implémentation comme une sorte de "mariage de raison" puisque nous dépendions déjà de zk.
Kafka stocke les validations d'offset dans une rubrique, lorsque le consommateur les valide, il publie un message d'offset de validation dans une rubrique "commit-log" et conserve une structure en mémoire qui mappe le groupe/le sujet/la partition sur l'offset le plus récent pour une récupération rapide. . Vous trouverez plus d’informations sur la conception dans cette page sur la gestion des décalages .
Maintenant, je veux définir le décalage à partir duquel je veux lire chaque sujet, sans avoir à vous réabonner après chaque seek () et poll () d'un sujet.
Une nouvelle fonctionnalité sur les outils d’administration de kafka permet de réinitialiser le décalage.
kafka-consumer-group.sh --bootstrap-server 127.0.0.1:9092 --group
your-consumer-group **--reset-offsets** --to-offset 1 --all-topics --execute
En fait, c’est le Zookeeper qui enregistre les décalages .
Ensuite, dans le consommateur, et pour un groupe_id particulier, vous pouvez choisir de lire un sujet spécifique comme suit:
Pour cela, vous pouvez utiliser la propriété:
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
Au lieu de "plus tôt", d'autres options sont:
Voici un exemple de consommateur de Kafka:
public class ConsumerGroup {
public static void main(String[] args) throws Exception {
if(args.length < 2){
System.out.println("Usage: consumer <topic> <groupname>");
return;
}
String topic = args[0];
String group = args[1];
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", group);
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put("key.deserializer",
"org.Apache.kafka.common.serializa-tion.StringDeserializer");
props.put("value.deserializer",
"org.Apache.kafka.common.serializa-tion.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList(topic));
System.out.println("Subscribed to topic " + topic);
int i = 0;
while (true) {
ConsumerRecords<String, String> records = con-sumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
}
}
Les crédits de Kafka sont stockés du côté du consommateur. Chaque consommateur stockera son décalage de chaque sujet, généralement dans le gardien de zoo.