从需求描述当中可以看出,文件比较大而且需要及时的响应给前端。这里我们可以使用异步来处理,接收请求与处理请求分离。可以使用消息中间件 MQ。
数据操作涉及到 MQ 异步处理,所以消息消费有可能重复,数据处理的时候要考虑到幂等。这里可以使用 Mysql 的乐观锁机制。在更新数据状态的时候带上上一个数据的状态。
MQ 数据消费有可能会出现处理异常,这个时候我们就需要系统可以自动的去驱动中间状态的数据到达最终状态。所以使用定时任务处理文件解析处理中的数据。
1、E-R 图
这里包含两个对象:一个是文件信息;一个是解析文件保留的具体数据。比如你有一个 excel 文件:
- file_info 这个表是保存这个 excel 文件的基本信息以及解析状态。这个状态可以驱动文件解析的整个过程(正常或者异常)。
- file_record 这个表是保存解析 excel 文件里面的每条数据的。
注意:这个表设计只是基本的核心字段,你可以根据业务进行扩充。
2、正常流程
在正常流程当中,服务端收到请求直接保存文件信息,然后发消息给 MQ,自己并不处理。直接返回给客户端,这个处理效率是极快的。文件的处理交给 MQ 的消费者,这样 MQ 消费就可以慢慢消费。
修改 file_info 的时候注意 SQL 语句为:
update file_info status = 'processing' where id = xxx and status = 'init';
可以根据修改条数来判断是否成功操作数据库,如果修改条数为 0。则抛出异常,数据就会回滚。这样才能做到幂等。
3、异常流程
有可能 MQ 进行阻塞,导致 consumer 一直没有成功监听。下面定时任务就是一个兜底方案。
修改 file_info 的时候注意 SQL 语句为:
update file_info status = 'success' where id = xxx and status = 'processing';
可以根据修改条数来判断是否成功操作数据库,如果修改条数为 0。则抛出异常,数据就会回滚。这样才能做到幂等。