webman中数据库清空却仍然被定时任务访问到,不知道算不算一个bug

xiaobai1

由于之前项目放了一些测试数据,process下Task.php执行定时任务,查询出满足要求的数据,并写入Redis队列,进行短信邮件等发送通知。

然后昨天数据已经清空了,按理说今天就不应该有消息了,但是今天还是发送了消息,并且消息中带有一些字段数据,说明这条记录确实是被查询出来了。

可能的情况是虽然清空了数据,但是定时任务依旧读取着之前游标之类记录的数据,请问有办法解决这个问题吗?

更新一下,感觉不是数据库的问题。

$re = Db::name('xxx')->insertGetId($data);
if($re){
    redis_queue_send('task',$data);
}

因为是要先写入xxx表之后,再写入队列发送通知。但是查询xxx表里面,并没有写入过数据。所以正常来说,re是假,就不应该写入队列了。并且其他地方都没有入口写入这个队列,只有这一个地方。

所以说,要想写入队列,re必须为真,re如果为真,xxx表里面必定有数据才对。但是xxx表里面没有数据。。。懵逼了,求救

再补充一点,还有几个其他的不同的消息通知,也是类似的代码,有得队列名也叫“task”,然后在里面if判断执行不同代码,有的队列名是其他的。之前每天会收到4个通知。然后今天只有1条通知了。也就是说,昨天清空了数据库之后,有3条确实没有通知了,但是还是有1条在异常通知。现在就很懵,这条记录是如何一直存在且通知的。。。

1477 3 0
3个回答

changliaokf_com

我觉得这应该算BUG了

six

这种情况基本上是乌龙了,清空表不影响插入,插入成功自然可以如队列发邮件。
至于查询数据库没有插入的数据,有以下可能性。
1、你以为插入的是A服务器的数据库,实际是B服务器,俗称搞错服务器了。
2、你以为插入的是A数据库,实际上插入的是B数据库,搞错库了。
3、你以为插入的是A表,实际插入的是B表,搞错表了。
4、插入数据库后,表被定时脚本或者其他人清空了。

还有一种可能是,你的队列是延迟队列,比如是延迟到第二天发邮件。数据库清空了,但是队列里数据没清空,第二天还是可以发邮件。

还有可能其它地方入的队列,比如业务搞错队列,或者你清空的数据库没有关系的业务入的队列。比如就是其它业务也有task命名的队列,业务搞混了。

  • xiaobai1 2021-04-01

    感谢回复。
    1、确认过服务器数据库,确实就这一个,不会搞错。
    2、数据库也没有搞错,也是只有一个
    3、表也不会搞错,确实是同一个表,因为清空之前是正确的,后续也没有做任何修改。
    4、项目是我自己开发的,不会有其他人去碰的。而且从发送了邮件,到去查看这个表,也就一会的工夫,也不会有人如此坑我。。。
    队列也不会延迟,用的是即时发送的,并没有延迟一天。
    我这边虽然写的task,但其实名字更加复杂,不会有重名情况发生,我也遍历搜索了所有文件,确认只有这一处。而且即使重名,也不应该发送的是我这边的消息
    我这边能想到的情况都无法去解释这个事情,很头疼。。。

  • xiaobai1 2021-04-01

    我sb了,刚刚发现测试服务器竟然开着,我之前记得明明关闭了的,是测试服务器发出来的...

JustForFun

你说了那么多,代码也没几行。你这代码不能完整地表达你的逻辑。

  • xiaobai1 2021-04-01

    我觉得足够了,如果真的有人遇到过,或者了解相关知识,是可以明白的。如果没遇到过,给了完整代码也没有作用。
    逻辑很清晰,首先在我指定的时间定时发送了邮件,代表一定是在指定时间执行了redis队列任务。
    而相关代码块,整个项目只有上述那几行有,就说明,定时任务要么执行了那几行代码,要么发生了其他奇怪的事情。
    目前我只能假设是通过上面的代码去执行的redis_queue_send,那就代表上面的代码的re一定需要为真(re那条是一个日志代码,写入了一个发送记录日志,表示今天已经发送过)。既然为真了,那么数据库里面应该有那条记录才对。而数据库里面没有,这又是一个不合理的地方。
    如果数据库里面没有记录,那么理应会重复发生这个邮件,但是没有重复发送,说明定时任务读取的数据库里面是有发送记录日志的,所以今天才只发送了一次。
    但是我看不见这条日志,说明可能会存在一个幽灵数据库,里面存在着这些数据记录,但是我这边确实检查过了,使用的数据库确认百分比没问题。所以这个幽灵数据库是存在哪里的?
    而且,我已经清空数据库了,发送邮件的前提条件是某条数据满足某个要求,这条数据都被我删除了,数据库里面已经没有了,他是如何读取到的这条数据,是缓存还是其他长连接导致的问题?
    反正就是感觉可能有一个幽灵数据库(可能是我的知识盲点),或者是redis队列的bug。
    而且我觉得restart一下估计就会恢复,肯定是触发了某些奇怪的东西。
    代码方面就是正常的代码,就算把项目源码放上来了,没有遇到过这种情况的人,估计也是没办法解答的。在这只是希望学过相关知识,或者有遇到过相关情况的朋友,来给个解决方案。。。

  • JustForFun 2021-04-01

    @7646:你放的数据库插入代码对解决问题没什么用。关键的任务代码没给出来,也没有相关的调试信息,跟相关情况关系不大。。

  • xiaobai1 2021-04-01

    @7304:我sb了,刚刚发现测试服务器竟然开着,我之前记得明明关闭了的,是测试服务器发出来的...

年代过于久远,无法发表回答
🔝