我这边有一个定时器的问题想请教下:
目前我们系统中框架使用的定时器框架是springboot,quartz数据库使用的是mysql
现在有一个业务:
1.订单到了还款日之前,要给订单生成对应的账单,每次生成当月的账单。并且每个订单的付款金额都不相同
问题:
1.1:账单中有期数,不能重复生成
1.2:到底是一次查询出符合条件的账单,然后批量生成账单,一次性插入到数据库。还是使用线程去为每个订单生成账单。
2.以上生成的账单,采用定时器进行扣款,如果客户的余额中有金额的话,要进行扣款操作。
问题:
2.1:如何避免重复扣款
2.2:如何避免正在进行定时器执行,客户在其他业务上操作了余额。
2.3:因为扣款操作会保存操作流水,更新账单状态,余额表变动记录插入到数据库等操作,是采用一次性将这些数据插入到数据库好, 还是使用线程去执行,我能想到的是,如果进行一次性操作的话,,如果一个余额操作发生异常,那么其他的也随着事务回滚了。
以上的问题综合:
1.一次性将账单或者扣款操作的业务存到数据库好,还是使用线程,为每个订单或者每个客户启用一个线程去执行好。
思路:
1、批量数据是逐条处理,还是用多线程处理,主要取决于每次处理的数据量,几十到几百,用多线程还可以接受。数据量更大,创建线程带来的消耗太大。
2、如何避免客户操作余额?这个要看业务场景。一般来说批处理都是放在夜间处理的,在日间营业之前处理完所有数据即可。比如凌晨1:00-2:00批处理。
3、用Spring JDBCTemplate批量处理数据,尽量减少提交的时间。如果不能保证用户不操作余额,可以根据数据量和每条数据的处理时间创建多个线程(比如每个线程处理1万条数据)。