前言
为啥要写这样一个系列呢?工作过程遇到很多场景,不同场景有不同的方案,记录以备不时之需,此系列的每一篇会分四个部分讲解:解释场景、场景示例、解决方案、总结。方案现在只有思路,代码如有时间会更上(浅浅在写方案Demo中猝死)。最后说一下,我是刚工作不久的小白,在各位大神面前班门弄斧了,如发现方案不合理之处,亦或是更好的方案直接喷
场景解释(有终态的数据状态的批处理修改)
通过标题我们知道,这是一个批处理,更准确的说应该是定时任务,然后第二个点,有终态,什么叫有终态呢,举个例子:这条数据没有执行,执行中,执行完成;执行完成就是终态,不可能出现我从执行完成到其他的状态,这就是终态。通俗的讲:定时去执行一些数据,修改数据的某个有终态的状态。
场景示例
定时扫描短信发送表数据发送短信:先前把要发送短信的信息落库,然后定时去跑库发短信
解决方案
所解决方案前我们先分析场景的问题点:首先这种场景我如果发送过短信,就不能再发短信了,要是对用户不做校验的多发短信,用户会报警的~奸笑.jpg。而且我们也不能保证我们每次都发成功吧,要是发送短信的账号欠费了咋办?断电了咋办?没信号了咋办?。。。。其次,我们每次要查多少数据的问题,要是刷刷刷一次查出10000000条数据,服务器会不会挂呀?
针对我们分析过程所遇到两个问题,我想到了各自的解决方案,我们在数据库里面加上一个字段(与业务无关),用于标识数据的执行的情况:未执行、执行成功、执行失败;未执行是初始状态,执行成功是业务执行成功要修改的状态,执行失败异常情况的记录,每次要执行的是未执行和执行失败的数据,这样就能保证每一条数据只成功执行一次。关于数据量的问题,有了这个状态,我们就更好处理了,我们根据发送短信的响应时间,可以进行每批次500~1000量的处理。
总结
这个方案虽然能解决有终态的数据状态的批处理修改,但是也有其局限性,这个套方案只能用在单机并且是单线程运行,否则依然会存在多发的情况,譬如多线程同时查到同一条数据是未处理的,都进行处理,就出现了多发的情况。多线程跑批问题后面的章节再单独拿出来分析讨论。
网友评论