Cómo flujo cadena a otro / mono y aplicar otra presión de retorno de flujo?

Thomas Lee:

Tengo continuación código reactiva utilizando flujo en el núcleo del 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 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();

Como se puede ver, tengo el manejo de contrapresión en esto por una fuente externa a mi proceso (FluxSink.OverflowStrategy.LATEST). Sin embargo, también quiero contrapresión de configuración para mi proceso para Redis (redisHashReactiveCommands.hmset (clave, mapa)) ya que puede ser un cuello de botella más grande que la fuente externa de mi proceso. Espero que había necesidad de crear otro flujo de Redis parte y vincularlo con este proceso de cambio, pero ¿cómo puedo lograr esto, ya .flatMap trabaja sobre el tema y no una corriente de artículos?

Además, quiero para almacenar el mismo artículo se emite a Kafka también, pero el encadenamiento de flapMap no parece que el trabajo .. ¿hay una manera fácil de conectar todos estos juntos en un conjunto de llamadas funcionales (fuente externa -> mi proceso, mi proceso -> Redis, mi proceso -> kafka)?

Simon Baslé:

Si usted no está interesado en los objetos de resultado en la secuencia principal puede combinar tanto ahorra desde dentro de la flatMap. Habría que mover el subscribeOn e inicie sesión en el interior del flatMap así ponerlos en el interior Guardar editores:

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();

Alternativamente, si estás seguro de ambos procesos emiten ya sea un elemento de resultado o un error, es posible combinar ambos resultados en un Tuple2reemplazando whencon zip.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=212564&siteId=1
Recomendado
Clasificación