线程提高请求性能

一.在controller层加多线程异步处理

1.Spring单例模式下Controller层为什么能多线程同时处理请求参数

像我们以前在不用spring的时候,写一个对外的接口,要先继承 HttpServlet 类,去重写doGet和doPost方法,tomcat会在接收到一个socket连接的时候,将其请求参数封装,并调用这个doGet或doPost钩子方法(这里我们只说这两种常用的,其他的PUT HEAD等方法这里不提了)。 调用流程如下。

其中 FrameworkServlet.processRequest()方法会将你的入参放入到一个ThreadLocal里,这就解决了单例Controller在多线程下同时处理请求参数的问题。

因为ThreadLocal是线程独有的,在这里不会出现线程安全问题。

2.controller中使用异步的讨论

1、简单的异步化改造,不管是服务器是否处于存在瓶颈的状态,都不能提高性能,反而因为异步增加了线程间切换的成本,性能还会有所下降。所谓简单的异步化改造,就是controller异步化 + service的单一化异步(即内部不包含多个IO相关的异步方法)
2、必须对sevice层的某个方法做内部多异步方法的改造,才有可能提升性能。而这要做到以及做好,并不容易。你需要:
(1)明确这个方法是允许做异步化改造的。但往往一个service方法,它不应该是异步的,即它很可能是前后相互依赖。依据我的经验,我的应用场景95%以上都是后面的代码要依赖前面的读取结果,无法异步化。
(2)异步化改造后,可能一个方法要被拆成多个方法,这给系统带来了复杂性。但这一点我还不确定,因为我没怎么实践过。可能Task类能解决这个问题,使一个方法内多段代码异步执行,但我想这对编程能力的要求,应该不低,普通程序员可能容易出错。

https://bbs.youkuaiyun.com/topics/392369867

https://www.jianshu.com/p/554b5ea1ad76?u_atoken=74b48846-74c7-40a8-9866-10236817a43b&u_asession=01bv6KlgMJ_L8ezIYts0DxDp2-dFoJkPGLsJvcg_YaI_MdnnJqkqeT4ZrHS_ji_K4EX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K_02XZcgOhr15r2Oe_Fq6JZkC1LUOsbnJoxzzl_EpVkQGBkFo3NEHBv0PZUm6pbxQU&u_asig=05erbUuFtwb2BbVr7aucPIlp5hSuPEOnNwCxurUhfau_A0sFAxebjXJsIF_EMjEZqsbPpuIC10f4nhMFv1xJuyk3BTp5BA_ZN-GcrpuvNqUOlDvQqtFwl02N97jsCyteLAV6ea54Symbk8HdAxp9oeoVMkCI2abZTrlyJRgpbAROP9JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzUn1JlBt58pdn3pwAFLZtcrPMk9-k-KS_-qSAkCJrD74UDrMH9U5oL9icxwFsJSlo-3h9VXwMyh6PgyDIVSG1W_3-ZwyP_HYZz_N1PhaUZ3OIRox2heX479OC2z3E-OFfkBYvgDyumJs2W9XjKAvlm3SA5iNOVqDTbcsP2z_Z8DomWspDxyAEEo4kbsryBKb9Q&u_aref=6v2x5fRWMHgHVSC3srH80g5cOJI%3D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值