星空财务报表重算这个操作过程非常耗时,而且只能在报表客户端重算,不能在列表批量重算。如果想重算多个报表,还只能一个一个打开报表客户端点击重算,体验性非常不好,因此报表列表批量重算被提上日程。
报表列表批量重算有这几个问题:
多个用户如果一次添加多个报表,一起重算的话,对服务器压力很大;
重算是个耗时的操作,不能让用户在前端一直等待,需要将重算这个操作,放到后台;
想到这两个问题,我自然就想到了消息队列。提到消息队列,我们能想到它的三个适用场景:
解耦;
异步;
削峰。
2,3的场景都符合报表重算,异步就是将报表重算的同步请求,转为异步,放到后台计算,最后只需要将重算的结果回传给用户,削峰:考虑到公有云的资源有限,如果大量用户点击重算,同时操作的时候,对服务器的资源和数据库都会有很大的压力。所以采用消息队列解决报表批量重算成了最佳选择。接下来就是怎么实现消息队列。
在数据库建一张表,这个表存的是需要重算的记录,相当于消息队列的队列
采用新开后台线程的形式将重算的操作放到后台,但是每次重算操作只会开一个线程。
引用重试机制,重算失败的报表,设置一个最大重试次数,如果超过最大的重试次数,把重算错误记录到数据表里面。
引用星空特有的网控机制,重算报表的时候,添加网控,其他用户不能编辑这个报表,等重算完成,在释放网控。
在新开线程的时候,使用lock锁机制,避免并发而导致开启多个线程。
保证报表重算的幂等性,因为后台表会记录报表的唯一标识ID,一次报表重算只会在后台存一条记录。
后台数据表应该有个字段标识,重算成功或者失败的字段,还有个字段,记录重算错误信息,重算成功把标识置为true,重算失败置为false,然后将重算结果返回给前端用户。
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *