Java耗时并发任务如何设计

不忍直视 2019-09-03 11:02:32
接手到一个异步任务的项目,用户通过在前端,创建任务,任务创建好之后,会根据任务数据生成跟当前任务关联的数据,然后用户在前端点击执行任务,后台去查询任务下面关联的数据进行处理(每一个任务关联的数据约为几十到4、5百条),每一条数据处理的时间约为30s到1分钟左右。 目前采用的是为每一个任务,创建一个线程(线程池)去处理这个任务关联的数据,现在问题是如果用户创建的任务过多,每一个任务执行时间就会特别长,就会导致后面创建的任务等待时间特别长,请问各位大佬有没有好的设计方式呀,感谢大佬些呀
...全文
258 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
不忍直视 2019-09-04
  • 打赏
  • 举报
回复
引用 3 楼 瘦死的黑骆驼的回复:
这个业务在单台服务器上,当任务量过多时就会达到性能瓶颈,除了去优化每条数据的处理时间,好像没有其他办法,如何优化,2楼的同学也提供了一部分建议,可以考虑一下,不过还是要看你具体业务,如果这些方面都无法提升,可以考虑负载均衡,把这些任务全部扔到队列中,然后多台服务器的程序去消费这个队列任务,其实这个和你开线程池多线程消费是一个道理,但是单台服务器性能有限
感谢,现在是多台服务,不过没有引进消息队列,但是引进消息队列的话,感觉也差不多;我想的是,能不能类似cpu时间片执行的方式,一个任务执行一部分,然后再去执行另一个任务的一部分执行
不忍直视 2019-09-04
  • 打赏
  • 举报
回复
引用 2 楼 Xiaoyang的回复:
建议 一、可以在用户前端点击招行后 给予提示,如:当前任务排在第几位预计需要多少时间可以生成; 二、通过每个任务生成的线程池中 可以考虑再用多线程来分别处理每条数据? 三、不知道业务场景是什么样的,是否可以定时去执行(比如特定时间段去执行任务) 四、任务关联的数据,是否存在重用的可能?避免每次生重复处理
感谢您的建议哈 一、这个可以考虑,但是我们现在服务部署是多实例,估计有点麻烦 二、这个已经在用了 三、定时执行我也考虑过,但是感觉用不上 四、任务关联的数据是重用的
不忍直视 2019-09-04
  • 打赏
  • 举报
回复
感谢您的意见,但是这个是用户建的任务,整个服务都是用来运行任务的,凌晨执行的话,任务不就更长时间了吗,而且就用户体验就更不好了
baichangda234 2019-09-04
  • 打赏
  • 举报
回复
我之前设计过一个 任务公用组件 模块,和你说的模式很像,大致负责处理的业务是 前端开启开始任务,返回任务开始;此时任务加入队列,后台执行完任务将结果写入对应的表;前端刷新结果列表查看执行结果; 举个例子: 大批量导出数据,操作人员选择条件导出,开始任务成功;后台执行数据生成,生成完excel后将文件存入服务器,任务执行结果和文件路径存入导出任务结果表;操作人员刷新导出任务结果页面,查看执行结果并下载文件; ================================================= 以下说一下实现原理 因为后台采用集群模式,要将任务分散到多个服务器,尽量提高并行率 1、前端发送开启任务请求 2、后台接收到开启任务请求,将任务的json表示方式存入redis list 3、后台返回任务执行中 后台逻辑线 1、每个服务器在启动时候 都安排一个线程负责从redis list中取出任务(死循环,如果没有任务了会自然阻塞) (如果工作线程池中没有空闲线程,则等待10s后再检测工作线程池) 2、取到任务后交给当前机器的 工作线程池(此处建议使用Executors.newFixedThreadPool,线程池数量可以自行调整) 3、工作线程池根据取到的任务json执行任务,生成任务结果
瘦死的黑骆驼 2019-09-04
  • 打赏
  • 举报
回复
引用 10 楼 不忍直视 的回复:
[quote=引用 3 楼 瘦死的黑骆驼的回复:]这个业务在单台服务器上,当任务量过多时就会达到性能瓶颈,除了去优化每条数据的处理时间,好像没有其他办法,如何优化,2楼的同学也提供了一部分建议,可以考虑一下,不过还是要看你具体业务,如果这些方面都无法提升,可以考虑负载均衡,把这些任务全部扔到队列中,然后多台服务器的程序去消费这个队列任务,其实这个和你开线程池多线程消费是一个道理,但是单台服务器性能有限
感谢,现在是多台服务,不过没有引进消息队列,但是引进消息队列的话,感觉也差不多;我想的是,能不能类似cpu时间片执行的方式,一个任务执行一部分,然后再去执行另一个任务的一部分执行[/quote] 你这样做会涉及到你的业务拆分,比如说你发出了一个任务,任务有很多个阶段,要处理很多数据,你可以启用多个线程去处理不同的阶段和不同的数据,不过如果各个阶段或数据的处理对其他部分有依赖关系,这就又涉及了线程之间的数据共享,所以说这个是要根据实际业务来的 我之前提供的方案是把客户端用户建立的每个任务当做一个整体业务来执行的,用队列的方式,多个服务器并启用多线程(充分利用多核CPU)来消费队列会很快,然后全部都是并发执行
瘦死的黑骆驼 2019-09-03
  • 打赏
  • 举报
回复
这个业务在单台服务器上,当任务量过多时就会达到性能瓶颈,除了去优化每条数据的处理时间,好像没有其他办法,如何优化,2楼的同学也提供了一部分建议,可以考虑一下,不过还是要看你具体业务,如果这些方面都无法提升,可以考虑负载均衡,把这些任务全部扔到队列中,然后多台服务器的程序去消费这个队列任务,其实这个和你开线程池多线程消费是一个道理,但是单台服务器性能有限
Xiaoyang 2019-09-03
  • 打赏
  • 举报
回复
建议 一、可以在用户前端点击招行后 给予提示,如:当前任务排在第几位预计需要多少时间可以生成; 二、通过每个任务生成的线程池中 可以考虑再用多线程来分别处理每条数据? 三、不知道业务场景是什么样的,是否可以定时去执行(比如特定时间段去执行任务) 四、任务关联的数据,是否存在重用的可能?避免每次生重复处理
不忍直视 2019-09-03
  • 打赏
  • 举报
回复
有没有大佬呀,帮帮忙呀,困扰好几天了
NANU-NANA 2019-09-03
  • 打赏
  • 举报
回复
定时到夜间凌晨执行。

不忍直视 2019-09-03
  • 打赏
  • 举报
回复
感谢各位大佬,现在在上班,一会儿下班一一回复哈
oh_Maxy 2019-09-03
  • 打赏
  • 举报
回复
如果这个任务执行结果用户不关注的化,可以先返回已接受任务,再慢慢做,做好了可以给发个回执。

如果一定要实时响应,想办法优化服务:多线程、业务精简、SQL优化。如果性能达不到要求,考虑做集群,扩大服务端规模。
maradona1984 2019-09-03
  • 打赏
  • 举报
回复
1.优化性能,提升性能包括不限于增加服务器/替换高性能服务器/缓存/算法优化/sql优化 2.队伍过多数据可以考虑拒绝

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧