【问题标题】:How to think in reactive programming manner and convert traditional oops application into reactive application如何以响应式编程的方式思考并将传统的 oops 应用程序转换为响应式应用程序
【发布时间】:2020-01-27 12:03:36
【问题描述】:

在编写应用程序的传统方式中,我将应用程序划分为一组任务并按顺序执行它们。

  1. 从 Redis 获取给定规则组的规则列表
  2. 构造事实输入并触发规则。
  3. 通过命中多个规则来计算请求的响应(规则组 A 可能取决于规则组 B 结果)。
  4. 将响应发回给调用者。

如果我是使用spring web Flux响应方式来实现上述步骤,我该如何实现呢?

  1. 我已经使用 ReactiveRedis 从 redis 中获取数据。 ReactiveRedisOperations.opsForValue().get(ruleGroupName) 在我们 subscribe() 之前不会返回任何内容。但是 ReactiveRedisOperations.opsForValue().get(ruleGroupName).subscribe() 使处理线程具有反应性,并且执行转到应用程序中的下一行,而无需等待订阅者执行。

  2. 由于我的下一步取决于 Redis 返回的数据,因此我使用了 block() 选项使其等待。

在现实世界中,人们如何应对这种情况?提前致谢。

PS:Spring Web Flux 和响应式编程的新手。

【问题讨论】:

  • 从不阻塞,从不订阅(几乎)使用地图,平面地图,像回调一样思考,然后将单声道/通量返回给调用客户端。
  • @Thomas Andolf : 这是否意味着 map、flatmap 在从 ReactiveRedis 读取数据之前不会让处理线程进入下一行?

标签: spring-boot redis drools spring-webflux project-reactor


【解决方案1】:

响应式编程使用方法组合和链接(运算符),而不是像在命令式编程中那样通过将它们放在新行上来分离逻辑步骤。

因此,一旦您获得 Flux<T>Mono<T>(这里是您的 Redis 规则),您需要链接操作符以声明性方式构建您的处理步骤。

将每个输入元素 <T> 转换为单个对应元素 <R> 在内存中且无延迟的步骤通常表示为 map(Function<T, R>) 并生成 Flux<R>。反过来,在其上链接更多运算符。

将 1 个元素 <T> 转换为 N 个元素 <R> 和/或异步执行(即转换为每个 T 返回 Flux<R>)的步骤通常表示为 flatMap(Function<T, Publisher<R>>)

除此之外,Reactor 中还有丰富的专业运算符词汇表,您可以explore

最后,您的目标是链接所有这些运算符来描述您的处理管道,这将是 Mono<RETURN_TYPE>Flux<RETURN_TYPE>。 webflux 中的 RETURN_TYPE 可以是 Spring 可以编组的业务类型,也可以是 Spring 面向响应的类之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2021-10-11
    • 2016-10-28
    • 2016-08-12
    相关资源
    最近更新 更多