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

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 条回复
Hugehard
2023-10-08 14:07:04 +08:00
不只是看不懂,debug 我都搞不懂,目前在看一个项目,全靠 gpt 理解
yuhongtai114514
2023-10-08 14:32:48 +08:00
@BBCCBB 感谢,这就去看看~
yuhongtai114514
2023-10-08 14:34:12 +08:00
@b1t ok ~
yuhongtai114514
2023-10-08 14:37:12 +08:00
@statumer 好的,非常感谢,看来我过于相信 gpt 了(´_ゝ`),直接绕晕
yuhongtai114514
2023-10-08 14:45:05 +08:00
@GiantHard 帮助很大! 我去看看 Rx ,感谢解惑🙏
yuhongtai114514
2023-10-08 14:46:44 +08:00
@yazinnnn0 我之前一直以为这两个强关联🥹
imaple
2023-10-08 16:06:50 +08:00
确实有点难, 而且很难调试, 爆炸
cloud107202
2023-10-08 16:49:45 +08:00
unco020511
2023-10-08 17:43:55 +08:00
其实 rxjava 更多使用是在界面程序的,比如移动端应用,主线程不能做耗时操作,经常需要使用 callback,需要频繁切换线程.后台我感觉必要性没有那么大
vivisidea
2023-10-08 17:53:25 +08:00
subscribe / subscribeOn 调试起来要疯,我们之前有个项目试点了一下响应式,写的人觉得很爽,其它开发一脸懵,维护很麻烦,后来还是抛弃了
Huelse
2023-10-08 18:43:50 +08:00
不如学函数式编程,其核心思想要普遍的多。
rrfeng
2023-10-08 19:16:55 +08:00
当年写 angular 强行学习了一下 rxjs ,学起来太难,但是会了确实很好用(然而已经忘光了)。

前提是 js ,java/go 还是协程走起吧。
ychost
2023-10-08 21:07:43 +08:00
首先得理解什么是 IO ,IO 底层如何实现「同步非阻塞」的,然后再来看 flatMap 操作符的用处,如果不用 flatMap 自己该如何处理这些 IO 回调,如果业务里面 IO 少的话没必要上 reactor
mxT52CRuqR6o5
2023-10-08 21:12:48 +08:00
学过 rxjs 也实际应用过,没觉得有多好用(没有必要的话就不要去用),但如果有复杂的异步场景的话,不用 rx 写起来感觉就是寸步难行
Dlin
2023-10-08 22:50:20 +08:00
个人也觉得响应式是一种编程思想。是某个事务满足触发操作时触发的同步回调。每个 filter 只是这次触发中的执行过程中的一部分。说它异步,其实只是这一过程并非是人为有意去调用的。而是系统自己去调用的(subscribe)
comingnine
2023-10-09 01:42:37 +08:00
感觉解藕真不好调试
xarthur
2023-10-09 03:18:25 +08:00
其实你需要去了解一些函数式编程,响应式只是很自然的引用……
zhuangzhuang1988
2023-10-09 06:19:49 +08:00
https://www.bennadel.com/blog/4519-replacing-rxjs-with-a-state-machine-in-javascript.htm
想象成状态机试试
不过状态机会要写很多代码 rx 帮忙解决了
ma836323493
2023-10-09 10:22:53 +08:00
看看郭神 的 第一行代码, 了解这个应该轻松电吧
f14g
2023-10-09 10:23:50 +08:00
以前也是不理解这个,后来学校教 Verilog 的时候遇到了“线变量”这种东西,当时就理解了“响应式编程”了。

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

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

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

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

© 2021 V2EX