web-dev-qa-db-fra.com

Comment puis-je obtenir le DERNIER offset d'un sujet kafka?

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?

16
Neptune

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();

19
lynn

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));  
8
hiaclibe

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

5
Steven
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. 

1
rai.skumar