Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将焊剂连接到另一焊剂/单焊剂,并施加另一个背压?_Java_Reactive Programming_Project Reactor - Fatal编程技术网

Java 如何将焊剂连接到另一焊剂/单焊剂,并施加另一个背压?

Java 如何将焊剂连接到另一焊剂/单焊剂,并施加另一个背压?,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,我有以下使用堆芯磁通量的无功代码: Flux.create(sink -> ... /* listens to and receives from external source */ , FluxSink.OverflowStrategy.LATEST) .flatMap(map -> redisHashReactiveCommands.hmset(key, map)) //.flatMap(... //want to store same data async i

我有以下使用堆芯磁通量的无功代码:

Flux.create(sink -> ... /* listens to and receives from external source */ , FluxSink.OverflowStrategy.LATEST)
    .flatMap(map -> redisHashReactiveCommands.hmset(key, map))
    //.flatMap(... //want to store same data async into kafka with its own back pressure handling)
    .subscribeOn(Schedulers.parallel())
    .doOnNext(s -> log.debug("Redis consumed. Result -> {}", s))
    .doOnComplete(() -> log.debug("On completed."))
    .doOnError(exception -> log.error("Error occurred while consuming message", exception))
    .subscribe();
正如您所看到的,对于我的流程的外部源(FluxSink.OverflowStrategy.LATEST),我对此进行了背压处理。但是,我还想将我的进程的背压配置为redis(redisHashReactiveCommands.hmset(key,map)),因为它可能是比进程的外部源更大的瓶颈。我希望我需要为redis部分创建另一个流量,并将其与此流量链接,但是如何实现这一点呢


此外,我还想将相同的发射项目存储到卡夫卡中,但链接flapMap似乎不起作用。。是否有一种简单的方法将所有这些链接在一组函数调用中(外部源->我的进程,我的进程->redis,我的进程->kafka)?

如果您对主序列中的结果对象不感兴趣,可以从
平面图中组合这两个保存。您必须将subscribeOn和log移动到flatMap中,并将其放在内部存储发布服务器上:

Flux.create(sink -> ... /* listens to and receives from external source */ , FluxSink.OverflowStrategy.LATEST)
    .flatMap(map -> Mono.when(
        redisHashReactiveCommands.hmset(key, map)
            .subscribeOn(Schedulers.parallel())
            .doOnNext(s -> log.debug("Redis consumed. Result -> {}", s)),

        kafkaReactiveCommand.something(map)
            .subscribeOn(Schedulers.parallel())
            .doOnNext(s -> log.debug("Kafka consumed. Result -> {}", s)),
    ))
    //... this results in a Mono<Void>
    .doOnComplete(() -> log.debug("Both redis and kafka completed."))
    .doOnError(exception -> log.error("Error occurred while consuming message", exception))
    .subscribe();
Flux.create(sink->…/*侦听并接收外部源代码*/,FluxSink.OverflowStrategy.LATEST)
.flatMap(贴图->单声道)(
redisHashReactiveCommands.hmset(键,映射)
.subscribeOn(Schedulers.parallel())
.doOnNext(s->log.debug(“Redis consumered.Result->{}”,s)),
卡夫卡区域活动命令。某物(地图)
.subscribeOn(Schedulers.parallel())
.doOnNext(s->log.debug(“Kafka consumered.Result->{}”,s)),
))
//... 这会导致单声道
.doOnComplete(()->log.debug(“redis和kafka都已完成”)
.doon错误(异常->日志.error(“使用消息时出错”,异常))
.subscribe();

或者,如果您确定两个进程都会发出一个结果元素或一个错误,您可以通过将
when
替换为
zip
将这两个结果组合成一个
Tuple2
,谢谢。关于你的回答,我有几个问题:1.关于在内部发布服务器上使用
Mono
Schedulers.parallel()
,这实际上是按顺序处理每个发出的项目,还是在单独进入时并行处理所有项目?2.如何处理卡夫卡流量的不同背压?当
(卡夫卡反应堆使用通量)时,我应该使用
Flux.zip而不是
Mono
FluxSink.OverflowStrategy.LATEST
对(外部源代码->我的流程)和(我的流程->redis)都适用,但我想使用
.window(100)
对(我的流程->卡夫卡)流程进行批处理。1。它将有效地并行化flatMap的默认并发因子(256)。2.也许你需要两条独立的管道?查看要应用于createI的share运算符我在share()上找不到任何示例。。我只是把它应用在主焊剂上吗?Flux.create(sink->…,FluxSink.OverflowStrategy.LATEST).share().flatMap(map->Mono.when(redisHashReactiveCommands.hmset(key,map)…将
Flux.create(…).share()
存储在变量
foo
中。然后在
foo
中为Redis定义一个流量管道,为Kafka定义一个流量管道(这一个带有
窗口(100)
等)。您还可以使用
onBackPressure*
操作符来调整背压行为,从而消除了在
create
级别处理它的需要。谢谢..还有一个问题,我如何在内部通量(即内部
redisHashReactiveCommands.hmset(..)中生成发射项
)进行顺序处理而不是并行处理(但仍使其异步而不是阻塞调用),因为处理顺序很重要?我假设必须有一种方法指定单个后台线程用于处理所有发出的项?