J'écris un consommateur kafka
en utilisant Java. Je souhaite conserver le temps réel du message. Par conséquent, s'il y a trop de messages en attente de consommation, par exemple 1000 ou plus, je devrais abandonner les messages non consommés et commencer à consommer à partir du dernier décalage.
Pour ce problème, j'essaie de comparer le dernier décalage validé et le dernier décalage d'un sujet (une seule partition). Si la différence entre ces deux décalages est supérieure à un certain montant, je définirai le dernier décalage du sujet comme suivant. décalage afin que je puisse abandonner ces messages redondants.
Maintenant, mon problème est de savoir comment obtenir le dernier décalage d’un sujet. Certaines personnes disent que je peux utiliser un ancien consommateur, mais c’est trop compliqué. Est-ce que le nouveau consommateur a cette fonction?
Le nouveau consommateur est également compliqué.
//assign the topic
consumer.assign();
//seek to end of the topic
consumer.seekToEnd();
//the position is the latest offset
consumer.position();
Pour la version Kafka: 0.10.1.1
// Get the diff of current position and latest offset
Set<TopicPartition> partitions = new HashSet<TopicPartition>();
TopicPartition actualTopicPartition = new TopicPartition(record.topic(), record.partition());
partitions.add(actualTopicPartition);
Long actualEndOffset = this.consumer.endOffsets(partitions).get(actualTopicPartition);
long actualPosition = consumer.position(actualTopicPartition);
System.out.println(String.format("diff: %s (actualEndOffset:%s; actualPosition=%s)", actualEndOffset -actualPosition ,actualEndOffset, actualPosition));
Vous pouvez également utiliser les outils de ligne de commande du serveur kafka:
./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic topic-name
KafkaConsumer<String, String> consumer = ...
consumer.subscribe(Collections.singletonList(topic));
TopicPartition topicPartition = new TopicPartition(topic, partition);
consumer.poll(0);
consumer.seekToEnd(Collections.singletonList(topicPartition));
long currentOffset = consumer.position(topicPartition) -1;
L'extrait ci-dessus renvoie le décalage du message validé actuel pour le sujet et le numéro de partition donnés.