使用类消息队列+多线程解决报表批量重算的方案原创
金蝶云社区-CM9527
CM9527
8人赞赏了该文章 857次浏览 未经作者许可,禁止转载编辑于2021年09月17日 10:03:48

    星空财务报表重算这个操作过程非常耗时,而且只能在报表客户端重算,不能在列表批量重算。如果想重算多个报表,还只能一个一个打开报表客户端点击重算,体验性非常不好,因此报表列表批量重算被提上日程。

     报表列表批量重算有这几个问题:

  1. 多个用户如果一次添加多个报表,一起重算的话,对服务器压力很大;

  2. 重算是个耗时的操作,不能让用户在前端一直等待,需要将重算这个操作,放到后台;

想到这两个问题,我自然就想到了消息队列。提到消息队列,我们能想到它的三个适用场景:

  1. 解耦;

  2. 异步;

  3. 削峰。

2,3的场景都符合报表重算,异步就是将报表重算的同步请求,转为异步,放到后台计算,最后只需要将重算的结果回传给用户,削峰:考虑到公有云的资源有限,如果大量用户点击重算,同时操作的时候,对服务器的资源和数据库都会有很大的压力。所以采用消息队列解决报表批量重算成了最佳选择。接下来就是怎么实现消息队列。

  1.  在数据库建一张表,这个表存的是需要重算的记录,相当于消息队列的队列

  2. 采用新开后台线程的形式将重算的操作放到后台,但是每次重算操作只会开一个线程。

  3. 引用重试机制,重算失败的报表,设置一个最大重试次数,如果超过最大的重试次数,把重算错误记录到数据表里面。

  4. 引用星空特有的网控机制,重算报表的时候,添加网控,其他用户不能编辑这个报表,等重算完成,在释放网控。

  5. 在新开线程的时候,使用lock锁机制,避免并发而导致开启多个线程。

  6. 保证报表重算的幂等性,因为后台表会记录报表的唯一标识ID,一次报表重算只会在后台存一条记录。

后台数据表应该有个字段标识,重算成功或者失败的字段,还有个字段,记录重算错误信息,重算成功把标识置为true,重算失败置为false,然后将重算结果返回给前端用户。


图标赞 8
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0