如果要在 Spring webflux 和 Vert.x web 选一个,在不仅仅只考虑性能的情况下,选哪一个

2020-05-20 17:32:35 +08:00
 tctc4869

在 Spring webflux 和 Vert.x web 的两种都有基于 netty 的响应式 webmvc 框架选一个,在不仅仅只考虑性能的情况下,(例如灵活可扩展性,多种可能的开发方式选择)等,各位会选择哪一个?

除了 Spring webflux 和 Vert.x web,还有哪些呢?

11379 次点击
所在节点    Java
83 条回复
godoway
2020-05-21 17:18:20 +08:00
@tctc4869 你是指 route 的 block handler 么
一般来说不会用到这个,这个是到 worker 线程池里面拿一条线程来处理请求了。
正常来说请求的处理应该也是尽量使用 event loop 来处理。
在使用传统 jdbc 场合按官方的设计是使用 worker 线程处理请求数据库然后再传递到 event loop 线程。
其实就是熟悉的 netty 里的 event loop 和业务线程池组合的玩法。
PS4Platinum
2020-05-21 17:35:30 +08:00
没用过的话 都是坑
tctc4869
2020-05-21 17:43:17 +08:00
@godoway 使用传统 jdbc 场合,有官方的设计配置策略推荐?这个是在官方文档里哪里,我没找到。能给个链接么?
louislivi
2020-05-21 17:44:38 +08:00
先普及 java 9-11 吧 [手动狗头]
godoway
2020-05-21 18:13:40 +08:00
@tctc4869 官方有一个 JDBC client,
另外自己接 mybatis 之类的需要 worker verticle
然后通过 eventbus 通讯(这部分可以用 codegen 生成 service proxy 代码)
godoway
2020-05-21 18:19:23 +08:00
@tctc4869 忘了提还有一个 vertx.executeBlock
tctc4869
2020-05-21 20:17:48 +08:00
@godoway
找到了,你指的是在官方 vert.x core 核心文档下的 Running blocking code 那一节内容的演示的代码?我连 postgresql,用传统的 jdbc 驱动 jar 包,同时为了开发方便使用 orm 框架,如果是在 vert.x core 体系下,官方建议是用 Running blocking code 那一节的那里演示的代码吧?

不过你为什么会提 jdbc-client ?这个是 vert.x 出的把,如果用这个,那传统的 jdbc 驱动配合 orm 框架(不一定指 mybatis ),就 用不了吧。难道 jdbc-client 配合 worker verticle 和 vertx.executeBlock 是更好?
hantsy
2020-05-21 20:28:50 +08:00
@twogoods
@chihiro2014
MySQL 的 r2dbc 驱动有好两家了,https://r2dbc.io/

不过记得以前 Oracle Blog 中提到要重新定义一套 Jdbc 标准,不道道进度如何。

目前 R2dbc 规范是 Spring 自己的一套体系,API 太依赖 Reactor 。Redhat 明显对它不感冒,Vertx,Quarkus 都是了 SmallyRye Munity 实现支持 Reactive Streams 标准,当然也可以与现有的 Reactor,Rxjava 互通。
hantsy
2020-05-21 20:34:22 +08:00
找到一篇 Oracle blog: Asynchronous Database Access API (ADBA)
https://blogs.oracle.com/java/jdbc-next:-a-new-asynchronous-api-for-connecting-to-a-database
hantsy
2020-05-21 20:39:18 +08:00
目前 RDBMS 只有 R2dbc 是重新设计,很多其它的什么异步 Jdbc 操作都是用异步 API 包装 Jdbc 而已,没有彻底从驱动层解决问题。
chihiro2014
2020-05-21 21:24:50 +08:00
@hantsy ADBA 已经 gg 了。Oracle 正在重新弄 r2dbc 相关的东西
godoway
2020-05-22 00:14:56 +08:00
@tctc4869 我想说 jdbc-client 的实现就是在 worker 线程池跑查询,获取结果后在你调用的线程(eventloop)回调。
而 executeBlocking(Handler<Promise<T>> blockingCodeHandler, Handler<AsyncResult<T>> resultHandler)
这个方法干的就是这个,blockinghandler 在 worker 线程上执行,result 在你当前调用线程执行。
worker verticle 的话则是启用一个绑定了 worker 线程的 verticle,也就是里面的所有操作占用的都是 worker 线程而非 eventloop 。
所以使用传统 jdbc 的场合有两条路给你封装,一个是利用 executeBlocking,一个是封装成 worker verticle 。
PS. postgresql 建议可以考虑使用 vertx-pg-client,这个是异步的,不过还不是很完善就是了。
tctc4869
2020-05-22 08:19:32 +08:00
@godoway 对了,大佬,我还想问一下,你对 vert.x core 做 tcp 服务端有什么了解么?如果不了解,可以无视后面的话。

用 vert.x 做 tcp 服务端,要注意什么关键的地方么?比如 NetServer 的配置设置,有哪些关键的地方么?而在 vert tcp 的 handler 里,运行同步代码,同样也得用 executeBlocking 和封装成 worker verticle 。除了这个,还有哪些要注意的么?
ppgs8903
2020-05-22 08:59:26 +08:00
当然都不选,选 SPRING BOOT 的 SPRINNG MVC 模板
godoway
2020-05-22 09:10:09 +08:00
@tctc4869 虽然不太了解,不过核心思路一样的。就是非阻塞且耗时短的都可以交给 eventloop,阻塞或耗时长的都要交给 worker 。
例如你有一个计算很久的代码,如果交给 event loop 那么这个 event loop 就没法去处理其他了,所以要用 worker 。
其实 tcp 部分把他当成 netty 就是了
sagaxu
2020-05-22 09:32:06 +08:00
@tctc4869 使用 vertx 得搞明白 vertcle 和 context,唯一需要注意的点是 don't block the eventloop 。
micean
2020-05-22 10:07:24 +08:00
用了 vertx4 年了,vertx 最大的优势在于学习成本低……spring 的代码我是真的不想看。
但是 vertx 的组件真的很简易,比如说最新 4.0 的日志链路追踪,他只实现了 IO 时的接口,阻塞、非阻塞线程之间却没有,真的恼火。又比如在集群模式中,某种情况下节点失效时,没有处理发送失败的异常的接口……
所以想用 vertx 一定要自己封装……
hantsy
2020-05-22 10:43:14 +08:00
@chihiro2014 Oracle 首先实现了自己的一套 reactive jdbc 扩展(基于 Java 9 Flow ),然后再估计用个 Adaper 支持 R2dbc, https://groups.google.com/forum/#!msg/r2dbc/A9s8rN7EOPA/Db71lq2qAQAJ

目前 Oracle 的 Helidon 项目中的 Db Client 对 RDBMS 的异步操作也是封装了 JDBC 的 API,https://github.com/hantsy/helidon-sample/blob/master/se-dbclient/src/main/java/demo/PostRepository.java 驱动依赖还是 JDBC 。
ourslay
2020-05-22 13:35:23 +08:00
最近的项目选的 Spring WebFlux + R2DBC 。
有时间折腾那么 quarkus 也是个不错的选择
tctc4869
2020-05-22 18:44:44 +08:00
@sagaxu
@godoway
@yizmaoaa

vert.x 3.9 和 4.0 支持 jdk14 和 openjdk 1.4 么?

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

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

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

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

© 2021 V2EX