卡夫卡管理消费群体之间的抵销

时间:2018-08-08 23:24:45

标签: java apache-kafka kafka-consumer-api

假设我在2个Kafka分区中有一个topic(test),并且在每个消费者组中都有一个消费者的2个消费者组(X,Y)正在消费该主题。

现在,我想知道同一分区中另一个使用者组的偏移量。下面的伪代码将说明需求

*** Let's assume this is running in the context of consumer group X

TOPIC = “test”
// consumer for group x
Consumer<K, V> consumerX = new KafkaConsumer<>(consumerProperties);
consumerX.subscribe(TOPIC, new ReportOnRebalance(……..));

// Get the current assigned partition, could be null but keep searching 
// until partition got assigned to the consumerX
Set<TopicPartition> topicPartition = consumerX.assignment();

// Get the last committed offset
offsetAndMetadataX = consumerX.committed(topicPartition)

// consumer for group y
Consumer<K, V> consumerY = new KafkaConsumer<>(consumerProperties);

// manually assign because I am interested in the offset for the 
// partition consumerX is going to serve for
consumerY.assign(topicPartition)

// Get the last committed offset
offsetAndMetadataY = consumerY.committed(topicPartition)

// Do require logic with offsetAndMetadataC and offsetAndMetadataY
newOffset = foo(offsetAndMetadataX, offsetAndMetadataY)

// want to reset the offset for this consumerY and in this 
// partition
consumerY.seek(topicPartition, bar(newOffset))

// Change offset for consumerX and starting polling for messages
consumerX.seek(topicPartition, newOffset)
while(...) {
    consumerX.poll(..)
    ....
}


*** Now the same code will run in the context of consumer group Y, but the role will be reversed

consumerY.subscribe()
consumerX.assign()
...
consumerY.seek(topicPartition, bar(newOffset))
...
// Change offset for consumerY and starting polling for messages
consumerY.seek(topicPartition, newOffset)
while(...) {
    consumerY.poll(..)
    ....
}

我不确定上述逻辑是否有效。我不确定的部分是何时一个使用者组(X)在一台机器上进行预订,并且假设分区(1)被分配而同一使用者组(X)在另一台机器上进行了分配,但也确实在分配时进行了查找有所抵消。我不知道这行不通吗?

为什么要这样做,想了解分配和订阅的用法,我们还需要手动跳过处理另一个消费者组已经处理过的一些偏移量或重新处理另一个消费者已经处理过的旧偏移量

1 个答案:

答案 0 :(得分:1)

我没有尝试您在这里描述的内容,但是从官方文档看来,这应该可以按照您希望的那样工作:

https://kafka.apache.org/20/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#manualassignment

关键部分在此处突出显示:

  

手动分区分配不使用组协调,因此使用者故障不会导致重新分配分配的分区。 即使每个使用者与另一个使用者共享一个groupId,每个使用者也独立行动。为避免偏移提交冲突,通常应确保groupId对于每个使用者实例都是唯一的。

基本上,如果您开始手动将分区分配给使用者,则所有动态重新平衡都会自动关闭。因此,您应该小心一点,但看来Kafka确实允许您描述的情况。