有一个场景,要写一个对失败的数据进行二次请求的任务任务。
失败数据来源。队列中执行,一条处理时间为两秒。设置的计划任务处理失败的每十秒执行一次。
牵扯到表中有三个字段,status:1:成功,2:失败,next_cron_time:下次执行时间,cron_num:已执行次数,默认0;
首先从表中读取status=2(失败)的数据,进行再次请求,如果成功,更新status=1,如果失败,更新next_cron_time为24小时之后,并且corn_num+1,当corn_num > 7的时候,不在进行重新请求了,连续七次失败,再请求也没意义了。
由于失败的数据量比较大,现在有两个问题。
$order = 'cron_num asc,id asc';
$order = 'cron_num desc,next_cron_time desc,id asc';
$where = [
['status','=',2],
['cron_num','<',8],//处理7次,每次失败后24小时继续执行下一次
['next_cron_time','<',date('Y-m-d H:i:s',time())],
];
$info = (new FlowWorkModel())->order($order)->where($where)->field($field)->find();
$order = 'cron_num asc,id asc';:因为失败的次数比较多,如果按照'cron_num asc排序的话,有可能设置了下次执行时间的数据一直都达不到,因为失败的数据一直在增加,一直在处理新的失败的。
$order = 'cron_num desc,next_cron_time desc,id asc';:如果是这种的话,那刚开始失败的又很难再执行到第二遍。
有没有更巧妙的办法啊