我们有一个utils类,它将为给定的使用者组重置偏移量。这是当前代码(它有一个错误,无法很好地处理缺失的偏移量,这就是促使我深入研究的原因):
def resetOffsets(topics: Seq[String], groupId: String)
(implicit ec: ExecutionContext): Future[Map[TopicPartition, Long]] = {
// TODO add error handling so that an empty reduceLeft is not happening
Future {
withConsumer(groupId) { consumer =>
topics.map { topic =>
val partitions = consumer.partitionsFor(topic)
val tps = partitions.asScala.map(p => new TopicPartition(topic, p.partition())).asJava
val offsets = consumer.beginningOffsets(tps).asScala
consumer.commitSync(offsets.mapValues(new OffsetAndMetadata(_)).asJava)
offsets
}.reduce(_ ++ _).mapValues(l => l: Long).toMap
}
}
}
我正在尝试建立一个测试工具,以断言这种行为实际上正在按照我的预期进行,但是却遇到了时间问题,未创建消费者群体等问题……
"A KafkaHelper" should "reset offsets" in {
val kafkaHelper = new KafkaHelper(helperSettings)
val groupId = GroupIdBase + s"_${new Random().nextInt(Integer.MAX_VALUE)}"
println("Group id " + groupId)
val consumer = createConsumer(groupId)
consumer.assign(List(Partition).asJava)
println(consumer.subscription())
consumer.seek(Partition, 1L)
consumer.commitSync()
println(consumer.position(Partition))
whenReady(kafkaHelper.resetOffsets(Seq(Topic), groupId)) { result =>
result shouldEqual Map(Partition -> 0L)
consumer.position(Partition) shouldEqual 0L
}
}
我要完成的工作只是简单地处理一个使用者组(或将其手动设置为一些偏移量),调用我的重置功能,然后断言该使用者组确实已重置为0。
我遇到的一些问题:
whenReady
区块,我的消费群体才被创建。这会导致subscribe
方法出现问题,然后尝试检查当前分区。如何围绕此代码正确创建测试工具,以便构建自动测试套件?我正在使用Kafka的本地docker实例进行测试。我最初开始使用https://github.com/manub/scalatest-embedded-kafka,因为这是我们用来测试许多面对Kafka的代码的方法,但是由于不知道他是否以与普通Kafka集群相同的方式实现基础行为,因此决定拒绝使用它