在咱们平时的业务系统中,文件导入,文件导出是一个很常见的业务需求。正常状况下,同步导出就能够知足咱们80%的需求。可是对于数据量大,业务拼接复杂的系统来讲,导出超时,导入超时是不可避免的,并且是没法忍受的。异步能让业务线程在后台运行,没有等待时间,处理完成通知出来就好了。这种场景在现实生活中也很常见,好比医院里面拍CT,作体检时的体检报告,都是延后去拿结果的。前端
那何时会须要用到异步呢?统计、导入、导出、发送模板消息、订单状态变动后的复杂业务处理。。。 java
它们都有共同的特色:node
1.处理耗时长web
2.业务优先级低ajax
3.容易超时redis
4.数据量大后端
异步的优势:api
它能解决导出超时问题,能大大的提升接口请求处理速度,提升吞吐量,提高系统性能服务器
任何事情都有两面性,也许不具备绝对性,可是在这里是成立的。既然它有那么多优势,固然也会有缺点。架构
异步的缺点:
它比同步导出要复杂得多,接口多了几倍,所需服务器也要多,学习成本高,开发成本高
按流程来:
1.前端发出导出请求
2.接口服务器接到请求并校验参数
3.若是参数不符,直接弹出校验结果,流程结束!
4.生成一个任务实体,状态设为处理中并将实体写入redis。开启异步线程,在异步方法中调用导出接口。返回给前端在处理中状态
5.前端接受到已经在处理中返回值,开启ajax轮询,每隔10秒请求一次任务查询状态接口
6.导出接口将数据拼接完成
7.将数据传到文件服务器生成文件并返回url
8.从redis中取出任务实体将url写入,而且将状态设为已完成并更新redis(后端处理流程就结束了)
9.前端ajax请求发现返回值状态变成已完成后,取出url并中止轮询。
10.前端请求清除任务实体接口,经过后端接口将redis中的对象移除。
11.前端展现导出结果,自动下载或者手动点击能够根据业务来。
这里还有一个页面初始化的按钮变化流程。
1.打开页面后导出按钮置灰不可点击
2.ajax请求查询任务状态接口,若是显示没有任务在进行中,那就让导出按钮能够点击。若是状态是导出已完成,则显示下载按钮相关页面
另外,为了防止意外出现redis死锁的状况,致使客户一直用不了导出功能,每一个任务redis对象都有过时时间,设置为30分钟。也就是说,无论导出任务执行是否完成,30分钟后任务将放弃,用户能够再次点击导出按钮。
1.获取任务状态 getTaskStatus
返回实体TaskResultOut:
字段 | l类型 | 是否可为空 | 注释 |
status |
int | 不,默认0 | 任务状态(0=未开始,1=进行中 2=已完成) |
message | string | 是 | 提示信息(正确或错误) |
url | string | 是 | 文件地址 |
state | bool | 不,默认fasle | 任务成功仍是失败(y) |
2.注册导出任务(导出) registerExportTask
返回true/false,代表是否注册成功
3.清除任务状态 clearTaskInfo
返回true/fasle,代表清除是否成功
前端js由前端编写,具体的因为嵌套太深,就不贴出来了,在架构解析中已经说的很详细了。
"export": function(e) {
return t.post(r.api.form["export"], e, {})
},
getTaskStatus: function(e) {
return t.post(r.api.form.getTaskStatus, e, {})
},
registerExportTask: function(e) {
return t.post(r.api.form.registerExportTask, e, {})
},
clearTaskInfo: function(e) {
return t.post(r.api.form.clearTaskInfo, e, {})
}
点击取消后
异步导出的整个流程和设计就全在这里了。
因为篇幅有限,且导入的流程大同小异。直接奉上一副设计图吧。
代码是没有滴,东西是要本身创造滴!
--------------------------------------------------神秘的分界线---------------------------------------------------
2018-04-15补充
一些人说须要贴代码,但这个是涉及3个服务器的协做,(前端服务器,node层web服务器,纯后端接口服务器),代码太过于零散且没有多余的技术含量,没法贴上来,加上这套机制我在C#大型电商项目和java的多个项目中都有部署应用。对于不一样语言有不一样的实现。就目前来讲,在电商项目中稳定运行了一年多,它的可靠性已经获得了实际应用的考验。
服务器需求
组成这套系统最少要求(web服务器一台,接口服务器一台,redis服务器一台,文件服务器一台)
若是在java体系里面,先后端彻底分离,且有服务器资源充足的状况下
前端服务器
node层服务器(集群)
后端接口层服务器(集群)
redis服务器
文件服务器
架构定位
对于小公司来讲,服务器资源没有那么充足,可能实施起来有难度,且开发和学习成功较高
对于大型公司来讲,对于大数据量和复杂业务的导出,可能早就有了成熟稳定的框架来支持,例如任务中心这种完善的异步消息来实现,具备高可用,可伸缩的等稳定性很强的系统,也用不到了,
所以这套架构适合于中型规模的公司
各层级职责解析
node或者web
若是有疑问能够找我解答。