请教 JAVA 服务器现在是怎么处理大量的连接的?

2015-11-17 13:10:58 +08:00
 ncisoft
由于线程的缺陷, JAVA 在处理大量连接方面存在诸多限制,然后各种反人类的技术,如 Erlang node.js scala 开始大行其道,还有 golang 也出来了。有段时间没跟踪技术了,请教现在是什么情况,是否有新技术出现解决这个问题了?
7930 次点击
所在节点    Java
50 条回复
Cloudee
2015-11-17 16:23:19 +08:00
Servlet 从 3.0 开始支持异步了, SpringMVC 也有对应的支持,好好写的话可以释放掉 Servlet 占用的大量线程。但是目前我遇到的问题在于 JDBC 本身是同步的,因此各种 DAO 框架也是同步的,会有大量线程卡在数据库那边
ncisoft
2015-11-17 16:35:23 +08:00
@Cloudee 这是 JAVA 要处理的关键架构问题
ncisoft
2015-11-17 16:41:10 +08:00
各位,谢谢你们的回复,让我对当前的技术有了一定的了解。但是, netty nio 解决不了 service 层大量的线程问题,你们遇到过几百个 java 线程耗尽 CPU 资源,耗尽 db 资源的情况么。 nio 绝对不是银弹, coroutine 写起来太麻烦了,同步线程方式才是写代码的王道
ncisoft
2015-11-17 16:42:19 +08:00
单纯线程池也不是解决问题的正确道路
cloudzhou
2015-11-17 17:07:46 +08:00
@ncisoft 如果你单单指的是性能的话, netty 绝不逊于其他各种语言的实现方式。对于 Linux 机器,说到底都是 Epoll 模型。 Netty 基于函数回调,并不是需要依赖于大量的线程。
HunterPan
2015-11-17 17:11:14 +08:00
@ncisoft 几百个线程耗尽 cpu ,你用来处理 CPU 密集型的业务固然耗费 CPU ,如果 DB 资源耗尽,一般不就是请求 db 太多,或者没有缓存么
ncisoft
2015-11-17 17:17:02 +08:00
@cloudzhou 你还是没有明白我的意思, netty 只是解决了网络层的连接问题,可是后面的 service db layer 你跑不掉吧,这个不用线程怎么处理?
ncisoft
2015-11-17 17:19:33 +08:00
@HunterPan 缓存是不能包打天下的,你当都是微博、论坛、商城么,有的是不能依赖于缓存的业务系统。如果不是 cpu 密集,难道 service 层只做简单处理?
SparkMan
2015-11-17 18:14:35 +08:00
Netty 不就跟 Node.js 一样嘛。都是异步的,又不是每个连接就创建一个线程
china521
2015-11-17 18:16:11 +08:00
@ncisoft 所以才有了 golang, 我生产环境跑两年了,高并发,内存 CPU 一点压力都没
SparkMan
2015-11-17 18:16:33 +08:00
你说的“后面的 service db layer ”,不光 Netty ,别的语言也要处理这个问题,所以现在都 做分布式
paw
2015-11-17 18:17:54 +08:00
前端负载均衡到后端 N 台机器。。。
martifact
2015-11-17 18:22:30 +08:00
如果有 db 处理的话,就用 async-jdbc, jdbc 做连接池管理和负载均衡, 非阻塞返回 Future 对象添加回调。不过都没有比较正式的库,有一个用 netty 实现的 https://github.com/mauricio/postgresql-async
ncisoft
2015-11-17 18:24:07 +08:00
@china521 这要看应用特征的吧,可能你的应用就适合 golang 。 ps 并发连接峰值能有多少?
ncisoft
2015-11-17 18:24:54 +08:00
@martifact 你的方案是把 db 给累死吗?
martifact
2015-11-17 18:29:09 +08:00
@ncisoft 只不过把同步处理改异步,同样有连接数上限,哪来的累死
ncisoft
2015-11-17 18:33:04 +08:00
@paw 前端负载均衡到后端 N 台机器。。。这不是 java 方案吧
china521
2015-11-17 18:55:26 +08:00
@ncisoft golang 本身就是处理大并发这种业务的, 好比把业务做成 lua 脚本放到 redis 里跑一样高效.. Java 不太好评论,可能是历史原因..
ncisoft
2015-11-17 19:03:06 +08:00
@china521 不讨论 golang ,不挑起语言争论,
cloudzhou
2015-11-17 19:20:15 +08:00
@ncisoft 后面的 service db layer 这一块,在各种语言都是类似的,由类似“协程”的概念执行。
也就是说,并没有完全的异步,比如 orm 这一块。
现在多并发的解决方案,都是监听 M 个链接,如果有读写操作,就激发对应的行为,有使用回调也有不用的,不用的你可以理解为语言级别帮你做了。
在 Java 里面,也不是一个链接起一个线程,而是把这个链接的 Context 关联起来,当激发回调方法之后接着进行处理,和线程关系是 M : N 的模型, M 是链接数, N 是线程,其中 M 远远大于 N 。

类似 Golang ,是一种比较激进的做法, Goroutine 是一种非抢占式的运行,直到因为 IO 事件进行切换,所以对线程数需求非常的少。

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

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

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

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

© 2021 V2EX