1
shazh520 2018-11-14 18:47:05 +08:00
想用呢
|
2
FanError 2018-11-14 19:01:06 +08:00 via iPhone
简单的瞟了几眼,没搞明白这玩意儿的使用场景是怎么样的?
|
3
cyhulk 2018-11-14 21:22:59 +08:00 1
终于可以回答问题了,正好看到你这个问题,reactive stream 我一直在看,总结下来,就像上面的老兄说的,第一次看看不太懂,所以说学习成本还是有的,你要从原来的 servlet 体系过度到 reactive stream 体系,要去理解 reactive 的含义确实需要时间,尤其 reactor 里面有很多的操作需要理解。除此之外,spring 还有很多的工作要做,比如 security 以前是基于拦截器实现的验证,要对 reactive 进行适配,而且 db 这块,除了 mongodb 有 reactive client 外,jdbc 没有 reactive client,而且好多变量都是 threadlocal 的,servlet-worker 的还好用,reactive 的线程就比较乱了,不好梳理,所以现在漫漫长路啊。
|
4
lhx2008 2018-11-14 21:25:26 +08:00
我的个人项目 www.jinrishici.com 的 API 使用 Webflux,在公司里面用,要看领导同不同意了,如果不管就用呗。不过一般是不行的,有一点学习壁垒,别人看不懂你写的代码。
|
5
lhx2008 2018-11-14 21:35:04 +08:00 1
好处的话,就是可以吃到 Netty 的性能优势,而且项目布局遵循 Spring MVC 的风格,也可以和 Spring Cloud,Spring security 整合。
说到学习成本,其实只要不是 硬盘 /网络 IO 操作,完全可以按照原来的同步方法写,最后返回的时候包装一下就行了。如果涉及到 IO 操作就必须要用 Webflux 的异步 /线程池处理,或者用 Spring Data Reactive,最后整个性能还是不错的。 最大缺点是不支持异步 Mysql,不过这个 Netty 的程序都不支持,没有异步 JDBC 如果还没入坑的同学,我可以普及一下,就是 Stream 一把梭到底,没有 终结操作,然后 Stream to List 之后,不会退出 Stream,而是单个元素再套一个 Stream,然后可以随时转回正常 Stream,然后 Webflux 就把你写的这一坨 Stream 丢到 Netty 那边找条线程一起消费了,就是这么简单。 比 Stream 的优势是可以异步提交任务( EventBus ),可以控制某段代码在某个线程池执行,可以切分任务流到多个线程,串并行切换等等。 |
7
EXChen OP @cyhulk #3 我以前写过 Android,用过 RxAndroid 所以语法上并无明显障碍,听你这么一说这个技术的生态还不够完善,我们的系统主要是跟数据库打交道的,感觉提现不出它的优势之处。
|
9
cyhulk 2018-11-15 09:52:49 +08:00 1
@EXChen RxJava 是基于 Observe 设计模式设计的,reactive-stream 则不是,个人观点认为 reactive-stream 是一套严格意义上的 API,不管是 Observe 还是 reactive-stream 都是 event 驱动模式
|
11
cyhulk 2018-11-15 09:55:38 +08:00
@lhx2008 我觉得这个难度不在于 netty,而在于 stream 是如何反应的,从原来的 servlet-container 到现在的从 reactor-netty 在到上层的 webhandler,这整个流的贯穿是如何控制和流转的,这个思维转变才是最难的
|
12
cyhulk 2018-11-15 09:57:03 +08:00
@EXChen 事件总线模型的含义是不是所有人都关注总线,但是只对总线上自己关注的特定类型的时间感兴趣?如果你说的总线是这个样子的,那两者是有区别的
|
13
EXChen OP @cyhulk 对的,我对事件总线的认识是这样的,因为以前 Android 中的事件总线有用过,但不知道为什么后来 Android 开发中不推荐使用事件总线了,给出的原因是注册太多的事件会造成逻辑的混乱。不过现在主要做后端了,很少接触这类框架。
|
14
lhx2008 2018-11-15 10:22:39 +08:00
|
15
godoway 2018-11-15 11:41:03 +08:00
想用但有一个问题,现在大部分关系型数据库都不支持异步啊。
于是 webflux 的异步优势就又被数据库 io 阻塞弄没了。 另外 oracle 貌似在搞一个 ADBA(Asynchronous Database Access API), 而 pqsql 好像是支持异步但没官方的支持异步的 driver(第三方有一个 reactive-pg-client) |
16
cyhulk 2018-11-15 13:41:34 +08:00
@godoway 这也是部分原因,但是可以使用 publishon 处理,关键是 pagehelper 这种常用的插件是几月 threadlocal 的
|
17
godoway 2018-11-15 15:25:07 +08:00
@cyhulk 之前有看到一个 Mono.fromCallable(callable).publishOn(schedule)封装成异步,不过提供方案的人说这样会使用不了事务。
|
18
cyhulk 2018-11-15 15:37:16 +08:00
@godoway 是的,原因可能也是 threadlocal 变量的引用导致的,servlet-container 所有的操作都是在一个 worker 中,但是 reactor 是有线程应该取决于你的 subscriber 的
|
19
godoway 2018-11-15 16:52:01 +08:00 1
@cyhulk 本想说用不了事务就没什么意义了,不过想到 mongo 原本也不支持事务...
感觉 webflux 还是等非阻塞的 jdbc 出现了才能大面积推广吧。 |
20
gz911122 2018-11-16 18:10:56 +08:00
用这个我还不如用 vert.x 呢 起码比较成熟
|
21
cweijan 2018-12-21 15:17:41 +08:00
没必要用,
|
22
hangszhang 2019-08-31 08:09:02 +08:00
那种业务聚合型的代码可以使用,不过业务聚合型的代码用 node 更好...
|