Spring 应对 IO 密集 的 web 业务系统有什么成熟的做法

2021-08-22 12:50:23 +08:00
 golangLover
也写了 spring 一段时间,发现 spring 比起 event-loop 的相关框架再处理 io 密集或者并发多的时候是性能比较低。
查了相关的资料,总结出来就是

1: 直接换 vert.x,但是语法以及生态完全不同。
2: 上 spring cloud, 注册多个服务硬抗
3:spring webflux, 好像是改了 controller 那边的方法以及拦截器之类的,但其他可以复用?不知道有没有坑,以及生态怎么样
4: 多用 servlet3 返回 callable,复用处理线程。

大家在业务里最主要用的是 2 吗?其他是不是都有坑或者生态问题? 想请大家指教一下。谢谢
5155 次点击
所在节点    Java
44 条回复
zoharSoul
2021-08-22 13:45:05 +08:00
一般是多个机器硬抗. 反正服务水平扩展简单
EscYezi
2021-08-22 16:18:45 +08:00
没上 spring cloud,用的是 k8s 那一套
ikas
2021-08-22 16:23:00 +08:00
这与 spring 有啥关系...网络 io,高性能 spring 那也是用的 netty....
你只要选择一个高性能网络 io,比如 netty,然后再选择一个异步模型就完事了
ikas
2021-08-22 16:31:54 +08:00
1.选择 vert.x,那就是给你全套方案
2.选择用 spring webflux 作为 web 接口.那它就是解决了网络接入这一部分
3.选择用 servlet3,然后使用 netty 或者 Undertow 作为 servlet 实现,同上
2,3 你还要继续选择用啥异步框架.用 spring 的还是其他的..各种各样

至于 spring cloud,那是架构.而不是上面的 1,2,3.....
leonme
2021-08-22 16:38:08 +08:00
瓶颈不在 DB 在 spring 框架? 加个缓存轻轻松松单机 4000 QPS 啊
wellsc
2021-08-22 18:28:17 +08:00
@leonme 啥配置啊
golangLover
2021-08-22 18:32:00 +08:00
@ikas 不是太懂 这句话:“2,3 你还要继续选择用啥异步框架”,难道 spring webflux 不就是异步的框架了吗?你的意思是例如使用远程 api,应该使用非阻塞 http 的客户端这种?
golangLover
2021-08-22 18:33:19 +08:00
@EscYezi 就是增加 cluster,使得服务实例增加吗? 这个主要的优势是?
golangLover
2021-08-22 18:44:58 +08:00
@leonme spring 单机应该就是 500 左右吧,预设就是 200 个线程。 应该说瓶颈是在 spring 的 jdbc 连接吧。其实是看了这个: https://www.techempower.com/benchmarks/ 。Spring 在 IO 密集的 fortunes 评分,跌到 300 位以外,比起 node.js 甚至 php 的都低很多。。。。。。
ikas
2021-08-22 18:54:45 +08:00
@golangLover spring webflux 是一个异步的 web 框架,它异步采用的模型是 Reactor...
但是你 web 层之后的代码.不一定就是选择采用 Reactor 异步的模型,毕竟 java 有那么多异步库可以用
比如你可以用 spring 的 project reactor,也可以用 rxjava,甚至用 jdk 内置的 CompletableFuture
再往下说那就更烦了..比如 jdbc 要选啥样的异步库...如果用到 httpclient 又要选择啥样的....
golangLover
2021-08-22 18:59:59 +08:00
@ikas 但是 rxjava 在后端很少有落地的吧,基本上都是安卓前端用的。我觉得可行的第一就是 completablefuture,毕竟内置的,也必须要用。其他要再研究一下。谢谢
alamaya
2021-08-22 20:01:02 +08:00
golanglover 干嘛搞 java,直接换 golang 不就行了吗
chendy
2021-08-22 20:25:26 +08:00
1. 招人成本高
2. 不需要 Spring cloud,直接加机器就行
3. 不能同步写的异步都太难受了,业务逻辑堆起来之后更加难受
4. 没玩过,目测也不太行
notejava
2021-08-22 20:38:18 +08:00
这个锅,spring 不背
leonme
2021-08-22 20:57:58 +08:00
@golangLover 简单看了下评测项目(解析 json 、返回 plain text 、数据库连接等等),从测试结果来看,一般非 GC 语言优于 GC 语言,复杂框架优于简单框架,比如 servlet 优于 spring,如果只是简单的 echo,那 servlet 肯定优于封装度高的 springmvc,但实际项目谁会直接用 servlet 呢?还有 spring 中使用了封装度很高的 JPA,性能肯定不如直接用 JDBC 啊。。。所有这种评测项目看看就好了,没太大借鉴意义
yazinnnn
2021-08-22 21:05:50 +08:00
业务简单就换 vertx+kotlin
EscYezi
2021-08-22 22:05:31 +08:00
@golangLover 优势就是一楼所说,水平扩展简单,对于一般的 http 服务加机器就够了
leonme
2021-08-22 22:27:37 +08:00
@leonme 所以
pengtdyd
2021-08-22 22:30:55 +08:00
花了非常大的力气选语言,选框架,选技术,远远没有多买一台服务器来的实在。
golangLover
2021-08-22 23:47:08 +08:00
@leonme #15 @chendy #13 那 java 不那么难受的异步应该怎么写。我看 completablefuture 都 50 多个方法。。。。厉害

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

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

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

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

© 2021 V2EX