我正在使用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();
有更聪明的方法吗?我的意思是,在我看来有点复杂(拉链部分,总体而言)。
答案 0 :(得分:1)
是的,您可以使用delayElements(Duration.ofSeconds(1))
操作直接执行需要拉链。反应堆酷项目总是有所改进,因为它是一个持续的升级所以让我们变得粘稠:)希望是有帮助的!