多任务多线程业务问题,求意见

吾同树 发布于 2015/06/25 13:47
阅读 805
收藏 2

业务场景:现系统有一功能,业务比较简单,程序上几乎也只是往一张表插入数据,但是此功能使用相当频繁,业务高峰期,操作人数也很多,重要的是,每插入一条数据,需要调用其他四个系统的远程接口(接口间没有关联关系),这就导致了明明很简单的一个操作,但是要花费很长时间,客户端体验不好。

目前做法:我把所有远程调用逻辑都单独起了一个线程(new Thread方式),线下测试OK,上线后遇到业务操作高峰期,线程过多,直接导致tomcat假死,没辙只好回滚。

情况就是以上,有什么好的思路解决效率及线程问题吗?

加载中
1
红薯
红薯

一个 Tomcat 搞不定就多个 Tomcat !

首席撸出血
首席撸出血
回复 @悠悠然然 : @红薯 赤裸裸的被鄙视了
悠悠然然
悠悠然然
红薯现在已经退化了,别听他的了。
吾同树
吾同树
已经有三个节点了啊,高峰期在十分钟内三个tomcat相继直接假死,不报任何错误,停止前的日志都是正常的业务日志。。
1
v64500
v64500

线程池的作用就是限制系统中执行线程的数量。
http://blog.csdn.net/sd0902/article/details/8395677
构建四个线程池,每个线程池执行一种远程调用逻辑。
threadsPool.submit(new Runnable() {
    @Override
    public void run() {
        // 远程调用逻辑
    }
});

这样就可以解决线程过多的问题。
其实我觉得,用ForkJoinPool更合适。
http://www.infoq.com/cn/articles/fork-join-introduction

v64500
v64500
回复 @吾同树 : >如果我用线程池处理,线程池都是不用关闭的吧? 使用时不用关闭。 当tomcat停止时,手动关闭。 http://it.deepinmind.com/java/2014/11/26/executorservice-10-tips-and-tricks.html >那么在业务空闲期线程会一直在内存中,会有影响吗? 线程池不是开的特别大的话,没什么影响,只是占用一点内存。
吾同树
吾同树
如果我用线程池处理,线程池都是不用关闭的吧?那么在业务空闲期线程会一直在内存中,会有影响吗?
0
vvtf
vvtf
用队列如何。
0
悠悠然然
悠悠然然

 我的建议是采用异步方式处理,Over

0
yeliuping
yeliuping
用线程池+队列;相应的接口是否可优化 ,能减少访问的则减少,能缓存的则缓存。
0
ajavaloser
ajavaloser
报啥错?
0
泥瓦匠BYSocket
泥瓦匠BYSocket

引用来自“悠悠然然”的评论

 我的建议是采用异步方式处理,Over

悠然哥所谓的异步是否如下:


请求系统有回调地址,可供被访问系统调用回调进行处理? (比如,调用第三方支付接口时用到很多的)
这样类似于ajax。

悠悠然然
悠悠然然
就是把这些活放那里由另外当然线程或线程组去干活
0
GITTODO
GITTODO
难道你没想过把这些业务封装下,用生产者消费模式来处理?
0
中山野鬼
中山野鬼
哈,多线程的提不了啥建议。只能说说多进程模式。进程总数不变。网络进程接收的消息包含附属内容,打包成任务丢到任务队列里由多个业务进程中的某个处理。
返回顶部
顶部