一.在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类能解决这个问题,使一个方法内多段代码异步执行,但我想这对编程能力的要求,应该不低,普通程序员可能容易出错。