Java 限制读取Mongodb集合的反应器通量的吞吐量

Java 限制读取Mongodb集合的反应器通量的吞吐量,java,spring,mongodb,project-reactor,reactive-kafka,Java,Spring,Mongodb,Project Reactor,Reactive Kafka,我正在使用Spring5,详细介绍反应堆项目,从一个庞大的Mongo收藏到一个卡夫卡主题阅读信息。不幸的是,卡夫卡消息的生成比使用它们的程序快得多。所以,我需要实现一些背压机制 假设我想要每秒100条消息的吞吐量。在谷歌上搜索了一下,我决定将该方法的功能结合起来,结果是一个Flux,它以预定义的间隔发出消息 // Create a clock that emits an event every second final Flux<Long> clock = Flux.interv

我正在使用Spring5,详细介绍反应堆项目,从一个庞大的Mongo收藏到一个卡夫卡主题阅读信息。不幸的是,卡夫卡消息的生成比使用它们的程序快得多。所以,我需要实现一些背压机制

假设我想要每秒100条消息的吞吐量。在谷歌上搜索了一下,我决定将该方法的功能结合起来,结果是一个
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();
//创建每秒发出事件的时钟
最终通量时钟=通量间隔(持续时间单位:百万(1000L));
//创建缓冲生产者
最终流出流量=
repository.findAll()
.map(此::buildData)
.map(此::CreateKafCamessage)
.缓冲器(100)
//在时间间隔内限制排放
.zipWith(时钟,(msgs,滴答)->msgs)
.flatMap(通量::fromIterable);
//订阅卡夫卡发件人
kafkaSender.createOutbound()
.发送(出站)
.然后()
.block();

有没有更聪明的方法?我的意思是,它在我看来有点复杂(总的来说是zip部分)。

是的,您可以直接使用
delayElements(Duration.ofSeconds(1))
操作,而无需使用它。反应堆冷却项目总是有改进,因为它是一个持续的升级,所以让我们保持粘性:)希望是有帮助的

很好的解决方案。但是,我使用
delayElements
方法使整个执行过程比使用
zipWith
技术更长。你能猜出原因吗?有点奇怪。我想知道你是否适合使用百万分之一的持续时间(500)而不是秒的持续时间(1)?我使用的是百万分之一的持续时间(1000L)。似乎方法
delayElements
消耗的CPU时间比带有勾号进程的
zip
要少得多:)更愿意使用带有背压的akka流support@cchantep,谢谢你的提示。然而,问题不是哪一个是最好的反应流实现,而是如何使用Reactor解决问题。事实上,Kafka和mongo都有akka流模块,可以组合在一起,因此这种情况不会成为问题OK,下一个项目我也会给akka流一个机会。