【问题标题】:Difference between Reactive programming using Mono and vanilla Java programming?使用 Mono 和 vanilla Java 编程的反应式编程之间的区别?
【发布时间】:2022-01-24 13:03:48
【问题描述】:

我尝试创建两个 api 端点,一个是响应式的,另一个是普通函数(不知道我们怎么称呼它,如果你知道,请告诉我:p) 所以根据理论,如果我同时击中 Reactive 端点两到三次,返回 Mono<String>time 变量说 10000ms,那么应用程序会正常运行,它不会阻塞并运行在预期的单独线程上。但是在正常功能下,行为也是一样的,为什么会这样呢?它不应该阻塞线程并阻塞另一个api调用直到第一个返回吗?

我想看看Mono&Flux 是如何实现异步行为的?它真的有什么不同?


 @GetMapping(path = "/testing")
  public String testing(@RequestParam(value = "time") Long time) throws InterruptedException {
    log.info("Thread {}", Thread.currentThread().getName());
    Thread.sleep(time);
    return "RETURNING" + String.valueOf(time);
  }

  @GetMapping(path = "/testingFlux")
  public Mono<String> testinging(@RequestParam(value = "time") Long time) throws InterruptedException {
    log.info("Thread {}", Thread.currentThread().getName());
    Thread.sleep(time);
    return Mono.just("RETURNING" + String.valueOf(time));
  }

【问题讨论】:

  • 你所说的“vanilla java”被称为“servlet stack”,或者在spring世界中,“SpringMVC”。也许在将其与 Reactive 模型进行比较之前先尝试了解它是如何工作的,因为您关于它阻止其他 api 调用的假设是错误的。
  • 您作为第二个示例发布的代码不是反应式的,它只是对反应器库的错误使用。正如所指出的,学习 servlet 堆栈是如何工作的……然后学习如何使用反应器库进行实际编码。然后再试一次。

标签: java spring spring-boot reactive-programming spring-webflux


【解决方案1】:

您观察到的是 Spring 无论如何都会处理多个线程,以便快速、异步/并行地响应传入的请求。

总是有多个工作线程同时处理请求。然而,传统方法和被动方法之间的“差异”在幕后变得更大。

您通常将应用程序设计为从头到尾都是响应式的,这意味着它从响应式域模型、响应式逻辑代码以及设计用于处理响应式代码的 api 上的响应式数据持久性开始。

最终,这一切都归结为:»您没有深入了解兔子洞,看不到“差异”。« 事实上,有很多概念,对于反应式应用程序来说,它们是“必须具备”的,就像经常一样提到“消息驱动”、“弹性”、“弹性”。 但是,您必须更深入地研究响应式应用程序的编程,才能发现它们。

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2015-08-21
    • 2019-01-23
    • 2011-06-14
    • 2016-03-03
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多