能站别躺,为什么?因为能减肥呀。一样的,能异步别同步,毕竟对于性能、响应都是好的。最近在做基于老系统拓展批量导入的功能,与老系统的交互就用DUBBO RPC了,不接MQ了。
如果是走RPC同步业务处理接口,就不能简单粗暴地直接:
从上面的交互可以看出,如果这样实现,数据量一大的话肯定各种问题:
1.数据量大的话rpc执行时间长,有可能HTTP请求会超时;
2.中间各个网络节点IO流压力大;
3.文件处理有可能内存溢出;
4.发生运行时异常概率非常高,分布式事务导致结果不一致:RPC那边已经提交了,但是调用方后面发生异常导致两边不一致;
5.客户端响应久,交互差...
那这样肯定要用异步了,不走异步队列的话,用定时任务把。处理数据冗余在数据库,定时任务定时去拿数据处理,维护处理结果:
这样执行速度优化了很多,前端响应也快。但是又怕定时器并发问题,虽然是一个服务,但是单个任务执行慢的话怕下一次触发定时任务同步造成脏读,错误并发处理。所以了解了下Spring的定时任务,发现Spring的定时任务默认是单线程的,那这样就不用担心,不然要加锁防止并发了。既然涉及到定时任务的并发控制,顺便记录一下比较简单的设置定时器并发:
一、在定时器上使用@Async注解实现异步任务,并需在启动类配合加上 @EnableAsync才会生效;
二、 手动设置定时任务的线程池大小:不使用@Async注解,新增启动代码配置类:
好了,简单做一下记录,虽然初级但是至少培养记录总结的习惯吧。