异步任务服务的作用,是将一些比较重的逻辑处理,以消息或者定时触发的方式进行发起,通过长时间的运行并最终完成处理。
特点:
- 耗时长:可能持续几个小时
- 逻辑重:需要做比较多的逻辑计算和数据拼装
在高峰期,因为这样的任务一旦跑起来,就会不断吃单机资源,容易出现高负载或者低负载的问题。
如果出现高负载,则需要拆分任务,或者控制并发,进行单线程处理。
如果出现低负载,那么可能会混跑更多任务,如果出现热点叠加,那么也会转化为高负载。
另外,如果出现代码发布,机器迁移等情况,还会导致任务执行中断的问题;这基本上是不可接受的,如果重新执行,则需要保持逻辑和数据是幂等的架构;而中间则可能存在脏数据。
优化方案一:改为分布式子任务处理
一个大的任务,可以分步骤,拆分为多个不同类型的子任务。
一个子任务完成,则可以自动生成下一个子任务。
总体通过事件流的方式进行逐级触发,最终完成链路更新。
每个子任务需要注意不要处理时间过长,最好拆解为10s左右就可以执行完毕。
优化方案二:改为调用RPC服务
如果逻辑都是子任务,那么子任务可以实现在rpc服务中。
这样通过调用rpc服务就可以完成逻辑过程,同时这个逻辑过程也是跟微服务的逻辑是封装到一起的。
rpc服务需要保持幂等性实现,这样的情况下,如果出现调用超时,还可以通过重试的方式解决。
另外就是逻辑耗时不宜过长,如果超时了,多次重试就会比较浪费时间。
利用rpc服务的负载均衡和水平扩容,就可以轻松实现容量管理。