Java 执行大量长耗时接口,怎么使用单机处理

2023-06-09 20:33:44 +08:00
 layxy

目前使用的线程池,但是因为任务量太大,单机线程池和队列很快就满了,因为某些原因只能使用一台机器,有什么办法可以优化下

2835 次点击
所在节点    Java
31 条回复
xiangyuecn
2023-06-10 17:07:00 +08:00
@hhjswf #18 直接加大核心线程数,不就等同于说明了最大线程数没卵用😂

目前我就是这样做的,核心线程数 等于 最大线程数,通过设置 allowCoreThreadTimeOut(true)去掉核心线程这个概念,每个线程都是普通的,超时没有任务了线程就被回收,充分利用机器性能,其实也就等于说明了最大线程数没有卵用
xiangyuecn
2023-06-10 17:18:37 +08:00
比如 核心线程数 等于 最大线程数 等于 100 个线程,核心线程空闲 5 秒关闭,队列给到 200 个容量

假如大部分时候只需要 20 个线程工作就够了,偶尔会有 200 个突发任务

那么一直会开启的可能就是 20 个左右的线程,突发的 80 个任务会开启新的线程处理,线程满了,多余的 100 个任务会被加入队列
-------

如果按照默认的逻辑,就算给到平常一倍核心线程数:40 个核心线程,200 个容量队列,100 个最大线程

200 个突发任务工作是不正常的:只会有 40 个线程同时工作,160 个被加入队列,因为队列没有满,不会开启新线程!
100 个最大线程成了摆设,队列卡在这个位置比较尴尬。
wxxxcxx
2023-06-10 19:58:04 +08:00
异步编程应该很适合,不知道 java 有没有好用的库
Red998
2023-06-10 22:37:14 +08:00
主要还是优化接口耗时问题、 从这方面入手。异步治标不治本,异
janus77
2023-06-10 22:54:38 +08:00
如果你线程池都满了,那物理配置不加的话也没法再有很大的提升
我的建议是换语言
byte10
2023-06-11 09:29:16 +08:00
你的任务是 是什么任务啊,也没说清楚,是计算型的,还是 IO 密集型的?你的任务是要循环读取 mysql 数据进行处理吗?计算密集型,只能物理解决或者优化计算的算法。IO 密集型 加线程,4 核心 500 个线程都没问题。
layxy
2023-06-12 09:09:56 +08:00
@kaneg 公司目前最高只让用 11,而且虚拟线程现在还没 release,还要升级到至少 java19,这个方案行不通
layxy
2023-06-12 09:11:24 +08:00
@byte10 IO 密集型,排查了下,耗时集中在 es 查询
layxy
2023-06-12 09:16:14 +08:00
@janus77 线程池满了,但是 cpu 占用不高,后续再加线程池大小再看看,最终的话引入 mq 应该是最好的,但是这个不好推进
byte10
2023-06-12 14:05:50 +08:00
@layxy ES 支持异步的,你选一个 ReactiveElasticsearchTemplate 客户端 , 这样就不需要多线程了。不过你要注意的是 Reactive 通常会有背压问题,需要判断 ES 服务器能否抗住,扛不住就注意要限流,不然会导致 es 挂掉。
zzw66681
2023-07-26 11:39:10 +08:00
单机可以换一下 disruptor

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

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

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

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

© 2021 V2EX