限制读取Mongodb集合的Reactor Flux的吞吐量

时间:2018-03-19 14:16:02

标签: java spring mongodb project-reactor reactive-kafka

我正在使用Spring 5,详细介绍Reactor项目,从巨大的Mongo集合中读取信息到Kafka主题。不幸的是,Kafka消息的生成比消耗它们的程序快得多。所以,我需要实现一些背压机制。

假设我希望每秒吞吐量为100条消息。谷歌搜索了一下,我决定将buffer(int maxSize)方法的特征结合zipping结果与使用预定义间隔发出消息的Flux

 // Create a clock that emits an event every second
 final Flux<Long> clock = Flux.interval(Duration.ofMillis(1000L));
 // Create a buffered producer
 final Flux<ProducerRecord<String, Data>> outbound =
            repository.findAll()
                      .map(this::buildData)
                      .map(this::createKafkaMessage)
                      .buffer(100)
                      // Limiting the emission in time interval
                      .zipWith(clock, (msgs, tick) -> msgs)
                      .flatMap(Flux::fromIterable);
 // Subscribe a Kafka sender
 kafkaSender.createOutbound()
            .send(outbound)
            .then()
            .block();

有更聪明的方法吗?我的意思是,在我看来有点复杂(拉链部分,总体而言)。

1 个答案:

答案 0 :(得分:1)

是的,您可以使用delayElements(Duration.ofSeconds(1))操作直接执行需要拉链。反应堆酷项目总是有所改进,因为它是一个持续的升级所以让我们变得粘稠:)希望是有帮助的!