响应式编程确实有点看不懂

2023-10-07 23:38:24 +08:00
 yuhongtai114514
因为 spring cloud gateway 里用了 project reactor 所以就去研究了一番,但是越看越模糊,只知道它的一些用法,比如在数据流上设定操作符(如 flatMap),然后当调用 subscribe 时,这一系列操作符就会被执行。但这个和普通的回调有什么区别呢,为啥说它是异步非阻塞的?

再比如在 spring cloud gateway 里,filter 返回的都是 Mono,当 reactory-netty 收到网络请求时,调用 subscribe ,触发 filter 返回的 Mono 中设定的一系列操作。但是实验了一下,发现 filter 之间也是串行阻塞的:
[在一个 filter 返回的 Mono 的 flatMap 中写下 Thread.sleep(2000L),发现在该 filter 后面的所有 filter 也被阻塞了。但是 gpt 告诉我 filter 之间可以是并行的,因为用了 project reactor ]

想问问这是为啥,感觉始终没有正确理解响应式编程,想问问 v 友们~
7787 次点击
所在节点    Java
44 条回复
nothingistrue
2023-10-09 14:02:59 +08:00
六,响应式编程,对应的编程概念是「流」,现实概念有个跟起非常像的,「流水线」。如果要搞这个,首先要把「流」搞清楚。Java8 的 Stream 可以用来入门。Kettle 、Spring Batch 可以用来练手。你最起码是 kettle 或者 Spring Batch (高级流应用,不能是一个处理器转发然后又回到普通代码去处理了) 用得比较熟悉了,才能去接触响应式编程。另外,你也可以直接从函数式编程、数据流,这些数学理论入手,不过前提是要先清空 C 、C++、Java 等全部常规编程习惯。

一到五跑题了,留着备用看吧。

一,同异步跟是否阻塞,不是一词两用,而是有关联的两个概念。

二,阻塞针对的不是当前过程,而是使用同一资源的多个过程之间的协作方式。通常都是 IO 比计算慢,故常见的阻塞是针对 IO 的阻塞。一个 IO 通道,如果只允许同时最多一个过程使用它,在该过程使用它期间其他过程只能等,那么这就是阻塞的。如果允许同时多个过程使用它,那么这是非阻塞的。

三,同步异步,针对的是调用者和被调用者之间的协作过程。如果被调用者不做完就不回复,同时调用者还一直等着它,那么这是同步的。如果被调用者没处理完就提前做个特殊回复,同时调用者认可这种特殊回复,那么这是异步调用。如果调用者这收到异步特殊回复之后,又再继续等待这个特殊回复转换成完整回复,那么这是异步之后的回转同步,或者,整体上来说,这还是同步调用。

四,再往外看调用者、非调用者的宿主程序,这时候同异步跟阻塞有了关联。如果把调用者宿主程序认为资源,调用关系——被调用者的执行行为认为处理过程,那么同步调用是阻塞的,异步调用是非阻塞的。

五,同步还是异步,技术上由被调用者决定,但业务上由有调用者决定。如果调用者实时关心回复结果,那么它永远要是同步调用,即使被调用者技术上异步,最终也要通过异步转回同步来变成同步。异步编程中,如何异步从来都不是关键,如何异步转会同步,获取去掉不必要的业务同步,才是关键。
yuhongtai114514
2023-10-09 19:38:59 +08:00
@xarthur ok~之前还没正式看过函数式调用,只知道是把函数传来传去
4kingRAS
2023-10-11 11:11:14 +08:00
你真正要看阻不阻塞要看线程 id ,当前代码运行在哪个线程
hdfg159
2024-01-03 23:25:42 +08:00
rxjava 玩一轮,你就懂了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/979656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX