Java 限制读取Mongodb集合的反应器通量的吞吐量
我正在使用Spring5,详细介绍反应堆项目,从一个庞大的Mongo收藏到一个卡夫卡主题阅读信息。不幸的是,卡夫卡消息的生成比使用它们的程序快得多。所以,我需要实现一些背压机制 假设我想要每秒100条消息的吞吐量。在谷歌上搜索了一下,我决定将该方法的功能结合起来,结果是一个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
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流一个机会。