用的是数据库驱动,数据库存储数据。出问题后显示的是队列执行成功,但是没有消化,然后就卡住了。

数据库sql日志执行的是这三条:

更新: 将处理数据,但是没有消化的队列数据初始化 并更新尝试次数+1;

这里我梳理下,简易流程图如下:

程序挂了,任务不跑,第一开始没思路,临时解决的是重启,但是执行一段时间又不行,特别是高峰的时候很绝望。然后想的是性能问题,是不是数据库介质不行。 开始查看数据库是不是产生了死锁了,删除锁。查看锁的语句如下:

然后又可以了。又过了一段时间,还是不行。只能重新排查,突然发现在重启队列的时候,查看数据库锁看到有条没读锁的sql,一直挂着,然后查看业务代码 ,发现这不就是查看据库数据是否重复数据的sql语句吗?,这里产生了死循环,效果就会出现下面流程图:

由于框架队列默认超时机制是60s,超过了就会重新执行,直到达到一定次数,程序就会die。这里面有日志,但是没留意这个超时异常中断的记录。

2、 代码不可以留有死循环的可能,一定杜绝,一开始就设定个次数。

本作品采用CC BY-NC-ND 4.0进行许可。转载,请注明原作者 Zzhpeng 及本文源链接。