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 吗?其他是不是都有坑或者生态问题? 想请大家指教一下。谢谢
5087 次点击
所在节点    Java
44 条回复
golangLover
2021-08-22 23:49:46 +08:00
@leonme #15 @yazinnnn #16 @pengtdyd #19 一台新机器就并发几百。。。那得加多少啊。。
golangLover
2021-08-22 23:51:02 +08:00
。。。。我发现这新的 V2EX 客户端用不惯都,@错了。大佬无视就好
chenqh
2021-08-23 00:42:59 +08:00
并发几百确定不是数据库的问题吗?
cubecube
2021-08-23 01:35:23 +08:00
如果是后台的网络 io,其实用 netty 就是事件驱动的
如果是磁盘 io,那么用啥都一样,linux 下磁盘的 aio 也就那样。

如果你觉得线程切换太消耗资源,那么 future 拿到后,使劲回调也一样。。
chenshun00
2021-08-23 08:32:49 +08:00
不管是不是 WEB 业务系统,绝大部分都是 IO 密集型的业务。

瓶颈首先不在相关框架,Spring 只是提供了一个平台,你要异步也可以上异步,如果 DB/Cache/RPC 是同步的,框架提供的异步就没有意义了。

没去过大厂,不知道大厂是怎么做的,我的做法加个 cache 。哪里是瓶颈其实大家心里都有点 B tree,只是改不动撒。

1. DB(慢 SQL,机器配置,CPU...etc)
2. 链路长(网络 IO)
3. 相关链路服务抖动(GC/CPU 高...etc)
4. 代码写的糙(上千次的同步 RPC 调用)
5. 框架配置(Redis 配置导致频繁 TCP 握手挥手,全部等待链接。SQL 等待链接)
5. 机器配置不行

思考这些比起整异步更实际一点,大厂忽略我。
leonme
2021-08-23 08:56:18 +08:00
@golangLover 你看下它这个机器配置啊,才 2core
wupher
2021-08-23 09:08:08 +08:00
web flux 包括 RxJava 在 IO 密集场景也会有 back pressure 的问题。

由于 event 过多,超出 reactor 出现能力,会出现 event 被丢弃的情况。

对于这个问题,我觉得无论采用哪种解决方案,服务的无缝伸缩能力都是更重要的。
jorneyr
2021-08-23 09:10:50 +08:00
负载均衡呗,多搞几台机器就可以了。
zmxnv123
2021-08-23 09:21:57 +08:00
我们的对象存储 gateway 是 spring
zhang77555
2021-08-23 09:38:33 +08:00
@golangLover 到底是数据库性能瓶颈还是 web 请求处理瓶颈, 数据库瓶颈可以优化 sql 优化数据库架构, 没法优化了就加个消息队列搞异步处理, web 请求瓶颈水平扩展就行了吧
ljzxloaf
2021-08-23 10:46:07 +08:00
fashionash
2021-08-23 10:49:29 +08:00
@golangLover 意思是你需要把你代码里的 rpc 、jdbc 等等一系列的都更换成异步模型,否则只是部分异步(要是较真的话也不算全链路的异步了)。但理论上来说,如果能解决网络 web 部分的异步,底层 jdbc 什么的性能上来说也能满足。就看你实际业务对异步的真实需求了
ps.我自己有个类似网关的 java 服务就用 webflux 异步化了 web 层,底层用的都是同步的,平响上也有提升
eric96
2021-08-23 10:55:33 +08:00
netty+event loop 自己写
glfpes
2021-08-23 11:52:59 +08:00
处理 IO 密集的场景要靠架构设计,比较常见的是把 IO 密集的工作抽象成一个微服务,把 IO 工作外包出去独立维护。
BBCCBB
2021-08-23 12:13:00 +08:00
不知道淘宝的 rxjava 异步化进展到哪里了...
dqzcwxb
2021-08-23 14:25:25 +08:00
用 Completablefuture 代价最低,在任何框架都可以使用
X0ray
2021-08-23 16:51:18 +08:00
IO 密集型应用的优化就是两个方向,异步和批量。
异步用 completable future 就挺好。
批量主要是接口协议的变化,比如以前 rpc 对象传参,可以把请求响应都改成 list,这样减少调用次数和 rtt.
golangLover
2021-08-23 22:46:01 +08:00
@ljzxloaf #31 这个之前看过,一时间把它忘了。哈哈
golangLover
2021-08-23 22:47:49 +08:00
@fashionash #32 webflux 的坑大吗,改造 spring 的会不会很麻烦,想预估一下时间。谢谢
golangLover
2021-08-23 22:48:04 +08:00
@glfpes #34 这也算一个办法。谢谢

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

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

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

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

© 2021 V2EX